美文网首页android开发知识Android开发经验谈Android开发
Android周记三:打造结合retrofit2与rxjava的

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

作者: 秋风Capton | 来源:发表于2017-11-29 18:56 被阅读83次

    前几天离职了,让人失望且辱骂员工的老板,要求还那么多,爷我走了。
    总算有时间来充实自己了,今天想了想,还是熟悉一下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

    相关文章

      网友评论

      本文标题:Android周记三:打造结合retrofit2与rxjava的

      本文链接:https://www.haomeiwen.com/subject/fidpbxtx.html