android开发知识Android开发经验谈Android开发

Android周记三:打造结合retrofit2与rxjava的

2017-11-29  本文已影响83人  秋风Capton

前几天离职了,让人失望且辱骂员工的老板,要求还那么多,爷我走了。
总算有时间来充实自己了,今天想了想,还是熟悉一下retrofit吧,其实对于它的内部源码,现在我暂时也没兴趣去了解,先给它来个封装吧,方便以后自己集成。

传送门 https://github.com/Ccapton/RxRetrofit

核心代码:基类 BaseApi.java

import com.capton.rxretrofit.listener.HttpOnNextListener;
import com.capton.rxretrofit.retrofit.RetrofitUtil;

import retrofit2.Retrofit;
import rx.Observable;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

/**
 * Created by capton on 2017/11/29.
 */

public class BaseApi {

    private Retrofit retrofit;  // retrofit 对象
    protected String baseUrl = "";  // 服务器根地址
    private String method= "";  //  方法标志,用于在获取数据后的回调里区分不同的api


    public String getMethod() {
        return method;
    }

    public void setMethod(String method) {
        this.method = method;
    }

    public String getBaseUrl() {
        return baseUrl;
    }
    /*
    * 设置服务器根地址
    */
    public void setBaseUrl(String baseUrl) {
        this.baseUrl = baseUrl;
    }

    public HttpOnNextListener onNextListener;   //  数据监听器

    public BaseApi(HttpOnNextListener onNextListener) {
        this.onNextListener = onNextListener;
    }

    /*
    *  获取retrofit对象
    */
    public Retrofit getRetrofit(){
        this.retrofit = RetrofitUtil.getRetrofit(baseUrl);
        return this.retrofit;
    }
    /*
    *  开始进行网络请求
    */
    public void doHttpDeal(Observable<String> observable){
        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<String>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onNext(String value) {
                        if(onNextListener!=null)
                            onNextListener.onNext(value,method);
                    }

                    @Override
                    public void onError(Throwable e) {
                        if(onNextListener!=null)
                            onNextListener.onError(e);
                    }

                });
    }



}

代码结构

很简陋😆

1. 用我这个封装库如何编写Api? 请参考下面的NewsApi.java

· NewsApi.java要继承BaseApi.java
· 在NewsApi里要新建一个独立的接口,里面的抽象方法返回值为Observable<String> ,方法内的参数配置具体请参考retrofit2官方文档。
· baseUrl 根据业务需求来设置。有时候需要多个服务器地址,所以我这块没有把它封装死,可以在新建子类api的时候分别设置不同的服务器根地址。

import android.content.Context;

import com.capton.rxretrofit.R;
import com.capton.rxretrofit.api.BaseApi;
import com.capton.rxretrofit.listener.HttpOnNextListener;

import retrofit2.http.GET;
import retrofit2.http.Query;
import rx.Observable;

/**
 *
 *  这个接口用的是我的极速数据新闻api,演示api。
 *  如果到时请求不到数据了,应该是被前面的人把剩余的请求数消耗完了,请自行找接口测试吧
 *
 * Created by capton on 2017/11/29.
 */

public class NewsApi extends BaseApi {

    private NewsServer server;
    private String appkey;
    public final static String GET_NEWS = "get_news";  // 请求方法 ,每个接口类请自由定义(拿到数据后,在回调里的辨别是哪个api的哪个请求)

    /**
     * 演示api,获取新闻数据
     * @param context 这里的context是为了获取系统资源,如果不需要context,则你新建BaseApi子类时可以不传context.
     * @param onNextListener 监听回调
     */
    public NewsApi(Context context, HttpOnNextListener onNextListener) {
        super(onNextListener);
        appkey = context.getResources().getString(R.string.jisu_news_appkey); // appkey 不是必须项
        setBaseUrl("http://api.jisuapi.com/news/");        // 1. 设置baseUrl
        server = getRetrofit().create(NewsServer.class);   // 2. 获取Server实例
    }


    public void getNews(String channel,int start,int num){
        setMethod(GET_NEWS);   // 3. 设置方法
        doHttpDeal(server.getNews(channel,start,num,appkey));  // 4. 开始请求
    }

    private interface NewsServer{
        /**
         *  以包裹 String 类型的Observable<String>类型返回,则可以自由地选择解析框架、
         *  很直接地可以看到请求到的数据本体
         * @param channel
         * @param start
         * @param num
         * @param appkey
         * @return
         */
        // channel=头条&start=0&num=10&appkey=yourappkey
        @GET("get")
        Observable<String> getNews(@Query("channel") String channel, @Query("start") int start,
                                   @Query("num") int num, @Query("appkey") String appkey);
    }
}                    

2. 在Activity或Fragment中新建API对象并调用

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.getData).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getData();
            }
        });
    }

    private void getData(){
        // 新建NewsApi对象
        NewsApi newsApi =new NewsApi(this, new HttpOnNextListener() {
            @Override
            public void onNext(String data, String method) {

                ((TextView)findViewById(R.id.showNews)).setText(data);

                // 自定义解析的方案
                if(method.equals(NewsApi.GET_NEWS)){
                    NewsBean newsBean = (NewsBean) JsonUtil.strToObject(data,NewsBean.class);
                    if("0".equals(newsBean.getStatus())){ 
 
                    }
                }
            }

            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
            }
        });
        newsApi.getNews("科技",0,10);
    }

好吧,这个封装库就简单介绍到这,感兴趣的朋友就来我的github瞧瞧
https://github.com/Ccapton/RxRetrofit

上一篇下一篇

猜你喜欢

热点阅读