Rxjava+ReTrofit+okHttp深入浅出-终极封装二(网络请求)

Rxjava+ReTrofit+okHttp深入浅出-终极封装
背景:
学习Rxjava和retrofit已经很长时间了,功能确实很强大,但是使用起来还是有点复杂,代码的重复性太高,所以决定把基于retrofit和rxjava的处理统一封装起来,实现的功能:
    1.Retrofit+Rxjava+okhttp基本使用方法
    2.统一处理请求数据格式
    3.统一的ProgressDialog和回调Subscriber处理
    4.取消http请求
    5.预处理http请求
    6.返回数据的统一判断
    7.失败后的retry封装处理
    8.RxLifecycle管理生命周期,防止泄露
    9.文件上传和文件下载(支持多文件断点续传)
    10.数据持久化
博客发出后谢谢大家的关注,原本只是自己学习后的一些经验总结,但是有同学运用到实战当中,这让我很惶恐(害怕出现问题会影响大家的项目开发);所以决定长期维护这个开源的封装,如果在使用过程中有任何问题,欢迎大家反馈!我这样也会及时更新和维护记录,方便大家及时查看和更新!所以博客部分地方会和最新版本有出入,但是整体思想是完全一样的,大家任然可以阅读本篇博客!后期也会出一个专栏,讲述下封装思想,欢迎大家关注!

效果:

封装后http请求代码如下
//    完美封装简化版
    private void simpleDo() {
        SubjectPost postEntity = new SubjectPost(simpleOnNextListener,this);
        postEntity.setAll(true);
        HttpManager manager = HttpManager.getInstance();
        manager.doHttpDeal(postEntity);
    }

    //   回调一一对应
    HttpOnNextListener simpleOnNextListener = new HttpOnNextListener<List<Subject>>() {
        @Override
        public void onNext(List<Subject> subjects) {
            tvMsg.setText("已封装:\n" + subjects.toString());
        }

        /*用户主动调用,默认是不需要覆写该方法*/
        @Override
        public void onError(Throwable e) {
            super.onError(e);
            tvMsg.setText("失败:\n" + e.toString());
        }
    };
是不是很简单?你可能说这还简单,好咱们对比一下正常使用retrofit的方法
[html]  view plain  copy
 
  1. /**  
  2.     * Retrofit加入rxjava实现http请求  
  3.     */  
  4.    private void onButton9Click() {  
  5.        //手动创建一个OkHttpClient并设置超时时间  
  6.        okhttp3.OkHttpClient.Builder builder = new OkHttpClient.Builder();  
  7.        builder.connectTimeout(5, TimeUnit.SECONDS);  
  8.   
  9.        Retrofit retrofit = new Retrofit.Builder()  
  10.                .client(builder.build())  
  11.                .addConverterFactory(GsonConverterFactory.create())  
  12.                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())  
  13.                .baseUrl(HttpManager.BASE_URL)  
  14.                .build();  
  15.   
  16. /        加载框  
  17.        final ProgressDialog pd = new ProgressDialog(this);  
  18.   
  19.        HttpService apiService = retrofit.create(HttpService.class);  
  20.        Observable<RetrofitEntity> observable = apiService.getAllVedioBy(true);  
  21.        observable.subscribeOn(Schedulers.io()).unsubscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())  
  22.                .subscribe(  
  23.                        new Subscriber<RetrofitEntity>() {  
  24.                            @Override  
  25.                            public void onCompleted() {  
  26.                                if (pd != null && pd.isShowing()) {  
  27.                                    pd.dismiss();  
  28.                                }  
  29.                            }  
  30.   
  31.                            @Override  
  32.                            public void onError(Throwable e) {  
  33.                                if (pd != null && pd.isShowing()) {  
  34.                                    pd.dismiss();  
  35.                                }  
  36.                            }  
  37.   
  38.                            @Override  
  39.                            public void onNext(RetrofitEntity retrofitEntity) {  
  40.                                tvMsg.setText("无封装:\n" + retrofitEntity.getData().toString());  
  41.                            }  
  42.   
  43.                            @Override  
  44.                            public void onStart() {  
  45.                                super.onStart();  
  46.                                pd.show();  
  47.                            }  
  48.                        }  
  49.   
  50.                );  
  51.    }  
可能你发现确是代码有点多,但是更加可怕的是,如果你一个activity或者fragment中多次需要http请求,你需要多次重复的写回调处理(一个回到就有4个方法呀!!!!反正我是忍受不了),而且以上处理还没有做过多的判断和错误校验就如此复杂!~好了介绍完了,开始咱们的优化之路吧!

项目结构:


Rxjava
如果你对Rxjava不了解,好吧骚年赶快学学吧,不然真会out了*******扔物线的金典rxjava
进阶:
Rxjava进阶一
Rxjava进阶二
Rxjava进阶三
Rxjava进阶四

ReTrofit基本设置
咱家今天的主角来了,咱们也深入浅出一下,前方高能,如果你是深度retrofit选手请直接跳过本节!!!
1.首先确保在AndroidManifest.xml中请求了网络权限 
[html]  view plain  copy
 
  1. <uses-permission android:name="android.permission.INTERNET"/>  
2.在app/build.gradle添加引用
[html]  view plain  copy
 
  1. /*rx-android-java*/  
  2. compile 'io.reactivex:rxjava:+'  
  3. compile 'com.squareup.retrofit:adapter-rxjava:+'  
  4. compile 'com.trello:rxlifecycle:+'  
  5. compile 'com.trello:rxlifecycle-components:+'  
  6. /*rotrofit*/  
  7. compile 'com.squareup.retrofit2:retrofit:+'  
  8. compile 'com.squareup.retrofit2:converter-gson:+'  
  9. compile 'com.squareup.retrofit2:adapter-rxjava:+'  
  10. compile 'com.google.code.gson:gson:+'  
ReTrofit基本使用:
后面的文章中我们都是用这个接口调试
[html]  view plain  copy
 
  1. /**  
  2.  * @api    videoLink    50音图视频链接  
  3.  * @url    http://www.izaodao.com/Api/AppFiftyToneGraph/videoLink  
  4.  * @method post  
  5.  * @param  once_no bool(选填,ture无链接) 一次性获取下载地址  
  6.  * @return json array(  
  7.  * ret:1成功,2失败  
  8.  * msg:信息  
  9.  * data:{  
  10.  *       name:视频名称  
  11.  *       title:标题  
  12.  * }  
  13.  )  
  14.    
1.初始化retrofit
要向一个api发送我们的网络请求 ,我们需要使用 Retrofit builder 类并指定service的base URL (通常情况下就是域名)。
[html]  view plain  copy
 
  1. String BASE_URL = " http://www.izaodao.com/Api/"  
  2.     Retrofit retrofit = new Retrofit.Builder()  
  3.             .baseUrl(BASE_URL)  
  4.             .addConverterFactory(GsonConverterFactory.create())  
  5.             .build();  
2.设置接口service
注意到每个endpoint 都指定了一个关于HTTP(GET, POST, 等等。)  方法的注解以及用于分发网络调用的方法。而且这些方法的参数也可以有特殊的注解。
Rxjava+ReTrofit+okHttp深入浅出-终极封装二(网络请求)_第1张图片
[html]  view plain  copy
 
  1. /**  
  2.  * 接口地址  
  3.  * Created by WZG on 2016/7/16.  
  4.  */  
  5. public interface MyApiEndpointInterface {  
  6.   
  7.     @POST("AppFiftyToneGraph/videoLink")  
  8.     Call<RetrofitEntity> getAllVedio(@Body boolean once_no);                              
  9. }  
3.得到call然后同步处理处理回调:
[html]  view plain  copy
 
  1. MyApiEndpointInterface apiService = retrofit.create(MyApiEndpointInterface.class);  
  2. Call<RetrofitEntity> call = apiService.getAllVedio(true);  
  3. call.enqueue(new Callback<RetrofitEntity>() {  
  4.     @Override  
  5.     public void onResponse(Response<RetrofitEntity> response, Retrofit retrofit) {  
  6.         RetrofitEntity entity = response.body();  
  7.         Log.i("tag", "onResponse----->" + entity.getMsg());  
  8.     }  
  9.   
  10.     @Override  
  11.     public void onFailure(Throwable t) {  
  12.         Log.i("tag", "onFailure----->" + t.toString());  
  13.   
  14.     }  
  15. });  
ReTrofit+Rxjava基本使用
和之前的retrofit使用区别:
1.在于我们需要修改service接口返回信息我们需要返回一个Observable对象
[html]  view plain  copy
 
  1. @POST("AppFiftyToneGraph/videoLink")  
  2.     Observable<RetrofitEntity> getAllVedioBy(@Body boolean once_no);  
2.然后初始化Retrofit需要添加对Rxjava的适配,注意一定要retrofit2才有这个功能哦
[html]  view plain  copy
 
  1. Retrofit retrofit = new Retrofit.Builder()  
  2.                 .client(builder.build())  
  3.                 .addConverterFactory(GsonConverterFactory.create())  
  4.                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())  
  5.                 .baseUrl(HttpManager.BASE_URL)  
  6.                 .build();  
3.回调交个rxjava去处理
[html]  view plain  copy
 
  1. HttpService apiService = retrofit.create(HttpService.class);  
  2.        Observable<RetrofitEntity> observable = apiService.getAllVedioBy(true);  
  3.        observable.subscribeOn(Schedulers.io()).unsubscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())  
  4.                .subscribe(  
  5.                        new Subscriber<RetrofitEntity>() {  
  6.                            @Override  
  7.                            public void onCompleted() {  
  8.                            }  
  9.   
  10.                            @Override  
  11.                            public void onError(Throwable e) {                                
  12.                            }  
  13.   
  14.                            @Override  
  15.                            public void onNext(RetrofitEntity retrofitEntity) {  
  16.                                tvMsg.setText("无封装:\n" + retrofitEntity.getData().toString());  
  17.                            }                            
  18.                        }  
  19.   
  20.                );  

ReTrofit+Rxjava进阶封装之路
Rxjava+ReTrofit+okHttp深入浅出-终极封装二(网络请求)_第2张图片

1.请求操作类封装,统一处理过程:
1.1首先初始化一个单利方便http请求; 这里用了volatile的对象, 不懂的同学可以参考我的另一篇博客
[html]  view plain  copy
 
  1. private volatile static HttpManager INSTANCE;  
  2.     //构造方法私有  
  3.     private HttpManager() {  
  4.         //手动创建一个OkHttpClient并设置超时时间  
  5.         OkHttpClient.Builder builder = new OkHttpClient.Builder();  
  6.         builder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);  
  7.         Retrofit retrofit = new Retrofit.Builder()  
  8.                 .client(builder.build())  
  9.                 .addConverterFactory(GsonConverterFactory.create())  
  10.                 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())  
  11.                 .baseUrl(BASE_URL)  
  12.                 .build();  
  13.         httpService = retrofit.create(HttpService.class);  
  14.     }  
  15.   
  16.     //获取单例  
  17.     public static HttpManager getInstance() {  
  18.         if (INSTANCE == null) {  
  19.             synchronized (HttpManager.class) {  
  20.                 if (INSTANCE == null) {  
  21.                     INSTANCE = new HttpManager();  
  22.                 }  
  23.             }  
  24.         }  
  25.         return INSTANCE;  
  26.     }  
1.2接口处理和回调处理:
basePar.getObservable主要是得打service中定义的observable对象(我们需要处理的接口对象) RxMap方法是统一处理结果回调信息处理 basePar.getSubscirber获取需要统一结果处理的subscirber对象
 /**
     * 处理http请求
     *
     * @param basePar 封装的请求数据
     */
    public void doHttpDeal(BaseEntity basePar) {
        Observable observable = basePar.getObservable(httpService)
                /*失败后的retry配置*/
                .retryWhen(new RetryWhenNetworkException())
                /*生命周期管理*/
                .compose(basePar.getRxAppCompatActivity().bindToLifecycle())
                /*http请求线程*/
                .subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                /*回调线程*/
                .observeOn(AndroidSchedulers.mainThread())
                /*结果判断*/
                .map(basePar);
        /*数据回调*/
        observable.subscribe(basePar.getSubscirber());
    }

2.数据统一请求参数和数据封装BaseEntity
2.1:getObservable通过传入一个**service对象获取需要处理的Observable对象
2.2:getSubScirber得到一个回调sub对象
这两个方法都需要其子类实现覆盖
2.3:在base里面我们继承Fucn1方法通过泛型去处理服务器返回数据判断(这时候我们可以在回调信息前提前处理错误信息),可以自己封装信息哦!如果是有效数据才返回给next方法,错误信息或者无数据等直接抛出一个自己定义的异常信息在onerror方法中处理!
[html]  view plain  copy
 
  1. /**  
  2.  * 请求数据统一封装类  
  3.  * Created by WZG on 2016/7/16.  
  4.  */  
  5. public abstract class BaseEntity<T> implements Func1<BaseResultEntity<T>, T> {  
  6.     /**  
  7.      * 设置参数  
  8.      *  
  9.      * @param methods  
  10.      * @return  
  11.      */  
  12.     public abstract Observable getObservable(HttpService methods);  
  13.   
  14.     /**  
  15.      * 设置回调sub  
  16.      *  
  17.      * @return  
  18.      */  
  19.     public abstract Subscriber getSubscirber();  
  20.   
  21.         
  22.    public T call(BaseResultEntity<T> httpResult) {  
  23.        if (httpResult.getRet() == 0) {  
  24.             throw new HttpTimeException(httpResult.getMsg());  
  25.         }  
  26.         return httpResult.getData();  
  27.     }  
  28. }  
 
     
 
     
3自定义异常处理
[html]  view plain  copy
 
  1. /**  
  2.  * 自定义错误信息,统一处理返回处理  
  3.  * Created by WZG on 2016/7/16.  
  4.  */  
  5. public class HttpTimeException extends RuntimeException {  
  6.   
  7.     public static final int NO_DATA = 0x2;  
  8.   
  9.     public HttpTimeException(int resultCode) {  
  10.         this(getApiExceptionMessage(resultCode));  
  11.     }  
  12.   
  13.     public HttpTimeException(String detailMessage) {  
  14.         super(detailMessage);  
  15.     }  
  16.   
  17.     /**  
  18.      * 转换错误数据  
  19.      *  
  20.      * @param code  
  21.      * @return  
  22.      */  
  23.     private static String getApiExceptionMessage(int code) {  
  24.         String message = "";  
  25.         switch (code) {  
  26.             case NO_DATA:  
  27.                 message = "无数据";  
  28.                 break;  
  29.             default:  
  30.                 message = "error";  
  31.                 break;  
  32.   
  33.         }  
  34.         return message;  
  35.     }  
  36. }  
4.请求失败后的retry处理
[java]  view plain  copy
 
  1. public class RetryWhenNetworkException implements Func1<Observable<? extends Throwable>, Observable<?>> {  
  2. //    retry次数  
  3.     private int count = 5;  
  4. //    延迟  
  5.     private long delay = 5000;  
  6. //    叠加延迟  
  7.     private long increaseDelay = 5000;  
  8.   
  9.     public RetryWhenNetworkException() {  
  10.   
  11.     }  
  12.   
  13.     public RetryWhenNetworkException(int count, long delay) {  
  14.         this.count = count;  
  15.         this.delay = delay;  
  16.     }  
  17.   
  18.     public RetryWhenNetworkException(int count, long delay, long increaseDelay) {  
  19.         this.count = count;  
  20.         this.delay = delay;  
  21.         this.increaseDelay = increaseDelay;  
  22.     }  
  23.   
  24.     @Override  
  25.     public Observable<?> call(Observable<? extends Throwable> observable) {  
  26.         return observable  
  27.                 .zipWith(Observable.range(1, count + 1), new Func2<Throwable, Integer, Wrapper>() {  
  28.                     @Override  
  29.                     public Wrapper call(Throwable throwable, Integer integer) {  
  30.                         return new Wrapper(throwable, integer);  
  31.                     }  
  32.                 }).flatMap(new Func1<Wrapper, Observable<?>>() {  
  33.                     @Override  
  34.                     public Observable<?> call(Wrapper wrapper) {  
  35.                         if ((wrapper.throwable instanceof ConnectException  
  36.                                 || wrapper.throwable instanceof SocketTimeoutException  
  37.                                 || wrapper.throwable instanceof TimeoutException)  
  38.                                 && wrapper.index < count + 1) { //如果超出重试次数也抛出错误,否则默认是会进入onCompleted  
  39.                             Log.e("tag","retry---->"+wrapper.index);  
  40.                             return Observable.timer(delay + (wrapper.index - 1) * increaseDelay, TimeUnit.MILLISECONDS);  
  41.   
  42.                         }  
  43.                         return Observable.error(wrapper.throwable);  
  44.                     }  
  45.                 });  
  46.     }  
  47.   
  48.     private class Wrapper {  
  49.         private int index;  
  50.         private Throwable throwable;  
  51.   
  52.         public Wrapper(Throwable throwable, int index) {  
  53.             this.index = index;  
  54.             this.throwable = throwable;  
  55.         }  
  56.     }  
  57.   
  58. }
5.BaseEntity子类覆盖主要方法,实现处理的和返回的一一绑定
[html]  view plain  copy
 
  1. /**  
  2.  * 测试接口请求数据  
  3.  * Created by WZG on 2016/7/16.  
  4.  */  
  5. public class SubjectPost extends BaseEntity {  
  6.     //    回调sub  
  7.     private Subscriber mSubscriber;  
  8.     private boolean all;  
  9.   
  10.   
  11.     public SubjectPost(Subscriber getTopMovieOnNext, boolean all) {  
  12.         this.mSubscriber = getTopMovieOnNext;  
  13.         this.all = all;  
  14.     }  
  15.   
  16.     @Override  
  17.     public Observable getObservable(HttpService methods) {  
  18.         return methods.getAllVedioBys(all);  
  19.     }  
  20.   
  21.     @Override  
  22.     public Subscriber getSubscirber() {  
  23.         return mSubscriber;  
  24.     }  
  25.   
  26. }  
6.然后定义service接口按照泛型的方式传递返回接口的数据
[html]  view plain  copy
 
  1. @POST("AppFiftyToneGraph/videoLink")  
  2.   Observable<BaseResultEntity<List<Subject>>> getAllVedioBys(@Body boolean once_no);  
7.定义返回数据的基础类,统一处理结果信息:
[html]  view plain  copy
 
  1. /**  
  2.  * 回调信息统一封装类  
  3.  * Created by WZG on 2016/7/16.  
  4.  */  
  5. public class BaseResultEntity<T> {  
  6.     //  判断标示  
  7.     private int ret;  
  8.     //    提示信息  
  9.     private String msg;  
  10.     //显示数据(用户需要关心的数据)  
  11.     private T data;}  
8.封装回调的 Subscriber 统一处理加载框,错误提示,结果回调等处理
我们在subserice的四个回调方法中,统一处理onstart中我们现实加载框,onerror中统一处理系统错误和自定义错误信息,我们可以在baseentity的 funct1方法中统一处理返回信息,比如咱们测试方法我们可以统一判断ret参数,如果返回的是2我们抛出一个自定义的错误;或者返回的array数据为空我们也可以统一抛出一个空数据的异常!在oonext方法中我们返回一个泛型接口,传出最后service接口指定的泛型的对象!
[html]  view plain  copy
 
  1. /**  
  2.  * 用于在Http请求开始时,自动显示一个ProgressDialog  
  3.  * 在Http请求结束是,关闭ProgressDialog  
  4.  * 调用者自己对请求数据进行处理  
  5.  * Created by WZG on 2016/7/16.  
  6.  */  
  7. public class ProgressSubscriber<T> extends Subscriber<T> {  
  8.     //    回调接口  
  9.     private HttpOnNextListener mSubscriberOnNextListener;  
  10.     //    弱引用反正内存泄露  
  11.     private WeakReference<Context> mActivity;  
  12.     //    是否能取消请求  
  13.     private boolean cancel;  
  14.     //    加载框可自己定义  
  15.     private ProgressDialog pd;  
  16.   
  17.     public ProgressSubscriber(HttpOnNextListener mSubscriberOnNextListener, Context context) {  
  18.         this.mSubscriberOnNextListener = mSubscriberOnNextListener;  
  19.         this.mActivity = new WeakReference<>(context);  
  20.         this.cancel = false;  
  21.         initProgressDialog();  
  22.     }  
  23.   
  24.     public ProgressSubscriber(HttpOnNextListener mSubscriberOnNextListener, Context context, boolean cancel) {  
  25.         this.mSubscriberOnNextListener = mSubscriberOnNextListener;  
  26.         this.mActivity = new WeakReference<>(context);  
  27.         this.cancel = cancel;  
  28.         initProgressDialog();  
  29.     }  
  30.   
  31.   
  32.     /**  
  33.      * 初始化加载框  
  34.      */  
  35.     private void initProgressDialog() {  
  36.         Context context = mActivity.get();  
  37.         if (pd == null && context != null) {  
  38.             pd = new ProgressDialog(context);  
  39.             pd.setCancelable(cancel);  
  40.             if (cancel) {  
  41.                 pd.setOnCancelListener(new DialogInterface.OnCancelListener() {  
  42.                     @Override  
  43.                     public void onCancel(DialogInterface dialogInterface) {  
  44.                         onCancelProgress();  
  45.                     }  
  46.                 });  
  47.             }  
  48.         }  
  49.     }  
  50.   
  51.   
  52.     /**  
  53.      * 显示加载框  
  54.      */  
  55.     private void showProgressDialog() {  
  56.         Context context = mActivity.get();  
  57.         if (pd == null || context == null) return;  
  58.         if (!pd.isShowing()) {  
  59.             pd.show();  
  60.         }  
  61.     }  
  62.   
  63.   
  64.     /**  
  65.      * 隐藏  
  66.      */  
  67.     private void dismissProgressDialog() {  
  68.         if (pd != null && pd.isShowing()) {  
  69.             pd.dismiss();  
  70.         }  
  71.     }  
  72.   
  73.   
  74.     /**  
  75.      * 订阅开始时调用  
  76.      * 显示ProgressDialog  
  77.      */  
  78.     @Override  
  79.     public void onStart() {  
  80.         showProgressDialog();  
  81.     }  
  82.   
  83.     /**  
  84.      * 完成,隐藏ProgressDialog  
  85.      */  
  86.     @Override  
  87.     public void onCompleted() {  
  88.         dismissProgressDialog();  
  89.     }  
  90.   
  91.     /**  
  92.      * 对错误进行统一处理  
  93.      * 隐藏ProgressDialog  
  94.      *  
  95.      * @param e  
  96.      */  
  97.     @Override  
  98.     public void onError(Throwable e) {  
  99.         Context context = mActivity.get();  
  100.         if (context == null) return;  
  101.         if (e instanceof SocketTimeoutException) {  
  102.             Toast.makeText(context, "网络中断,请检查您的网络状态", Toast.LENGTH_SHORT).show();  
  103.         } else if (e instanceof ConnectException) {  
  104.             Toast.makeText(context, "网络中断,请检查您的网络状态", Toast.LENGTH_SHORT).show();  
  105.         } else {  
  106.             Toast.makeText(context, "错误" + e.getMessage(), Toast.LENGTH_SHORT).show();  
  107.             Log.i("tag", "error----------->" + e.toString());  
  108.         }  
  109.         dismissProgressDialog();  
  110.     }  
  111.   
  112.     /**  
  113.      * 将onNext方法中的返回结果交给Activity或Fragment自己处理  
  114.      *  
  115.      * @param t 创建Subscriber时的泛型类型  
  116.      */  
  117.     @Override  
  118.     public void onNext(T t) {  
  119.         if (mSubscriberOnNextListener != null) {  
  120.             mSubscriberOnNextListener.onNext(t);  
  121.         }  
  122.     }  
  123.   
  124.     /**  
  125.      * 取消ProgressDialog的时候,取消对observable的订阅,同时也取消了http请求  
  126.      */  
  127.     public void onCancelProgress() {  
  128.         if (!this.isUnsubscribed()) {  
  129.             this.unsubscribe();  
  130.         }  
  131.     }  
  132. }  
9.自定义返回接口,泛型传递返回值
[html]  view plain  copy
 
  1. /**  
  2.  * 成功回调处理  
  3.  * Created by WZG on 2016/7/16.  
  4.  */  
  5. public interface HttpOnNextListener<T> {  
  6.     void onNext(T t);  
  7. }  
10.发起http请求处理
定义一个指定类型的回调类httpOnextListener,然后初始化一个统一处理返回结果的ProgressSubscriber对象,将sub传入给封装的BaseEntity对象中,发起网络请求,通过Rxjava后台处理网络请求,主线程处理返回结果;网络请求onext前,调用BaseEntity的fun1方法,统一判断返回信息(可预处理错误),最后通过自定义泛型httpOnextListener返回成功数据
[html]  view plain  copy
 
  1. //    完美封装简化版  
  2.  private void simpleDo() {  
  3.      SubjectPost postEntity = new SubjectPost(new ProgressSubscriber(simpleOnNextListener, this), true);  
  4.      HttpManager manager = HttpManager.getInstance();  
  5.      manager.doHttpDeal(postEntity);  
  6.  }  
  7.   
  8.  //   回调一一对应  
  9.  HttpOnNextListener simpleOnNextListener = new HttpOnNextListener<List<Subject>>() {  
  10.      @Override  
  11.      public void onNext(List<Subject> subjects) {  
  12.          tvMsg.setText("已封装:\n" + subjects.toString());  
  13.      }  
  14.  };  
不定期更新维护-GitHub源代码传送门
CSDN源码10月17日的版本(无法及时更新)-传送门

你可能感兴趣的:(Rxjava+ReTrofit+okHttp深入浅出-终极封装二(网络请求))