RxJava2+Retrofit2实现网络请求封装(二)

前面我们<>已经学会了去封装简单网络请求框架,但是在网络请求的生命周期部分处理的太过粗糙了,今天我们将引入Rxlifecycle来实现全自动化的管理,也使代码更加的简洁可控.

引入依赖

关于RxJava2和Retrofit2的依赖引入请参考前面的文章,我们直接从Rxlifecycle说起.

compile 'com.trello.rxlifecycle2:rxlifecycle:2.0.1'
compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.0.1'

引入时需要对应Rxjava的版本.现在所需要的包都有了,现在就可以再次折腾了.

新建RxUtil类,来做Rxjava的使用代码简化

public class RxUtil {
    /**
     * 无进度Schedulers
     */
    public static  ObservableTransformer applySchedulers() {
        return new ObservableTransformer() {
            @Override public ObservableSource apply(@NonNull Observable upstream) {
                return upstream
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread());

            }
        };
    }

    /**
     * 有进度Schedulers
     */
    public static  ObservableTransformer applySchedulers(@NonNull final Dialog dialog) {
        return new ObservableTransformer() {
            @Override public ObservableSource apply(@NonNull Observable upstream) {
                return upstream
                        .delay(1, TimeUnit.SECONDS)
                        .subscribeOn(Schedulers.io())
                        .doOnSubscribe(new Consumer() {
                            @Override
                            public void accept(@NonNull final Disposable disposable) throws Exception {
                                dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
                                    @Override public void onCancel(DialogInterface dialog) {
                                        disposable.dispose();
                                    }
                                });
                                dialog.show();
                            }
                        })
                        .observeOn(AndroidSchedulers.mainThread())
                        .doOnTerminate(new Action() {
                            @Override public void run() throws Exception {
                                dialog.dismiss();
                            }
                        });
            }
        };
    }
}

主要有两个方法,一个是无加载进度的,这个就很简单了,不带Dialog参数的就只是单纯的指定线程,而带有Dialog参数的则在前面的基础上实现了doOnSubscribedoOnTerminate这两个方法.doOnSubscribe主要处理了加载进度的显示及实现了取消请求的功能,doOnTerminate该方法不论是处理异常还是成功,都会最后执行,就像finally一样.

为了能获取到bindToLifecycle()的方法,需要我们去将Activity和Fragment继承RxAppCompatActivityRxFragment,当然我们也可以不去继承,但是需要参照RxAppCompatActivity的代码去实现接口LifecycleProvider,Fragment同样.

有了上面的代码,再结合<>里面封装过的内容,新的网络请求封装就完成了.

食用方法:

@POST("api/account/loginWithToken")
Observable> loginWithToken();

RetrofitManager.getInstance().create(IAccount.class).loginWithToken()
                    .compose(RxUtil.>applySchedulers(loadingDialog))
                    .compose(this.>bindToLifecycle())
                    .subscribe(new ResultObserver() {
                        @Override public void handlerResult(Account account) {
                            ShareData.getInstance().login(mContext, account);
                            handler.sendEmptyMessageDelayed(FLAG_SKIP_TO_HOME, 2000);
                        }
                    });

以上是项目中的一次网络请求,已经简化了很多代码,网络请求的错误和异常,我通过eventBus发给了BaseActivity来处理,当然都是很通用的处理,如果是需要对个别的需要特殊处理请结合自身情况做修改.

同时我更新了网络请求结果的类ResultObserver和前面文章中的BaseSubscriber基本差不多,请自行脑补.

同时我也新增了一个类来处理在Service中我们使用网络请求时的请求结果的处理

public abstract class ResultCallBack implements Callback> {
    @Override public void onResponse(Call> call, Response> response) {
        if (response.body().getCode() == Constants.NET_CODE_SUCCESS) {
            handlerResult(true, null, response.body().getData());
        } else {
            handlerResult(false, new Throwable(response.body().getMsg()), null);
        }
    }

    @Override public void onFailure(Call> call, Throwable t) {
        handlerResult(false, t, null);
    }

    public abstract void handlerResult(boolean success, Throwable throwable, T t);
}

以上就是全部内容,欢迎各位小伙伴点赞,关注.

你可能感兴趣的:(RxJava2+Retrofit2实现网络请求封装(二))