美文网首页安卓开发笔记
RxJava,RxAndroid,Retrofit使用

RxJava,RxAndroid,Retrofit使用

作者: TiaoPi | 来源:发表于2016-07-11 19:54 被阅读0次

    参开文章: 主要是扔物线大神给安卓开发者的详解,还有很多很多的文章;然后我这边就只写我自己的代码,网上很多文章都很好完全能够明白.

    项目准备使用RxJava,RxAndroid,Retrofit开发,然后就自己研究了几天,今天开始项目,就网络下载进行了分装,然后结合各路大神的文章,还有知乎的一些做了这个.

    主要是

    这个主要是就是对下载进行一个封装,然后就是可以根据json格式进行转换,主要是相同部分,开始的位置进行下载成功与否的判断,然后把data部分保留下来,用到了一个map的操作符.剩下的就是基本都一样,下载完事之后进行调用就OK了;

    比如类似这种格式的

    {
        "code": "2",
        "message": "OK",
        "data": "数据",
    }
    
    

    下面是项目的代码直接上

    • 添加依赖
        compile 'io.reactivex:rxandroid:1.2.1'
        compile 'io.reactivex:rxjava:1.1.6'
        compile 'com.squareup.retrofit2:retrofit:2.1.0'
        compile 'com.squareup.okhttp3:okhttp:3.4.1'
        compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
        compile 'com.squareup.retrofit2:converter-gson:2.0.1'
    

    添加依赖的时候好多人说的不是很一样,然后我自己的话就这样添加的,至于为啥,我也不知道,这个目前没有错, 也不知道是不是对的(当然我的下载是没有问题的)

    • 然后就是弄了三个类


    • ApiService.class
      这个类主要是,,,,看代码就行了,,, 请求前面不要加"/",添加会报404,这个要注意,也可加添加Headers,我实在代码设置Okhttp的时候添加的;

        @GET("test")
        Observable getTest(@Query("a") int a);
    

    就是这样的一个get请求,后面的大家应该都知道

    • HttpRetrofit.class
      这个类主要就是进行一些初始化.然后就是设置一些东西,然后就是绑定订阅, 这边的话是把Observable和Subscriber设置了泛型T进行连接,这样的话早设置线程转换的时候就不用重复添加代码了.看代码
    
    /**
     * Created by zhiguo on 2016/7/11.
     * 封装了一个RX系列网络下载的类    这边主要是做一些配置和初始化
     */
    public class HttpRetrofit{
    
        private static OkHttpClient okHttpClient;
    
        public HttpRetrofit(){
            okHttpClient = new OkHttpClient();
            setOkHttpClient();
        }
    
        /**
         * 设置调用OkHttpClient
         */
        private void setOkHttpClient(){
            
    
            okHttpClient.newBuilder()
                    .addInterceptor(loggingInterceptor)
                    .retryOnConnectionFailure(true)
                    .addInterceptor(new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request request = chain.request()
                            .newBuilder()
                            .build();
                    return chain.proceed(request);
                }
            });
        }
    
        /**
         * 初始化retrofit
         * @return
         */
        public Retrofit getRetrofit(){
    
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://api.lafeng.com/")  //服务器地址
                    .client(okHttpClient)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .build();
            return retrofit;
        }
    
        /**
         * 封装调用   主要是设置订阅的线程转换
         * @param observable
         * @param subscriber
         * @param 
         */
        public  void httpSubscribe(Observable observable, Subscriber subscriber){
            observable
                    .map(new Func1() {
                        @Override
                        public T call(T t) {
                            //在这里进行转化, 进行json外层部分的判断并返回
    
                            return t;
                        }
                    })
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .unsubscribeOn(Schedulers.io())
                    .subscribe(subscriber);
        }
    
        /**
         * 关联接口类
         * @return
         */
        public  ApiService getApiService(){
            return getRetrofit().create(ApiService.class);
        }
    
    }
    

    我的注释不是很多,基本都能明白,不过还是有一些坑的

    • HttpPost.class
      最后就是这个类,这个类是要是为了方便调用和统一管理,看一下就明白了,方便管理,可能也不是很有用
    /**
     * Created by zhiguo on 2016/7/11.
     * 这个类只要是设置下载返回的类      返回的结果在Subscriber
     */
    public class HttpPost {
    
       private static HttpRetrofit httpRetrofit = new HttpRetrofit();
    
        public static void getTest(Subscriber subscriber){
            httpRetrofit.httpSubscribe(httpRetrofit.getApiService().getTest(0),subscriber);
        }
    
    
    }
    
    

    好了,代码就这些,然后就是TestBean.class,这个类随便搞;

    调用是这样的

      HttpPost.getTest(new Subscriber() {
    
                        @Override
                        public void onNext(TestBean t) {
    
                            textView.setText(t.toString());
                        }
    
                        @Override
                        public void onCompleted() {
                        }
    
                        @Override
                        public void onError(Throwable e) {
                            e.printStackTrace();
                        }
                    });
    

    好,完事了,基本是可以的用的,其他的细节方面在弄弄;

    相关文章

      网友评论

        本文标题:RxJava,RxAndroid,Retrofit使用

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