我们在写具体项目的网络请求时,都要在每次请求成功的回调中首先处理REST的Wrapper(包装类),这个Wrapper包含了一个flage(成功标志位,表示此次请求成功与否),errorcode(错误码,请求失败后对应错误码显示错误提示),Entitie(实体类,具体所需要的数据)。现在项目中引入了RxJava,我们可以把处理Wrapper这个动作剥离出来,让最后的处理方法中只有Entitie,那么如何做呢,我们来看代码。
@Override public Observable<RegisterWrapper.MapData> execute(String... parms) { return mRepository.doRegister(parms[0], parms[1]).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .flatMap(registerWrapper -> { if(!registerWrapper.flag) return Observable.error(new ServerErrorException(registerWrapper.errorcode)); return Observable.just(registerWrapper.data); }); }
这是一个NetworkUsecase(网络请求用例),返回了一个Observable,订阅后就可获取这个接口的数据。这段代码中我使用了flatMap把持有wrapper的Observable转换为直接持有Entitie的Observable,当然前提是flag标志此次请求成功的状态下,当标志位显示此次请求失败后,直接调用Observable.error (),这里的ServerErrorException是我自定义的Exception,可以在后面集中处理error中作为类别进行失败错误类型的筛选,构造中传入errorcode。在调用error后,把数据通道指向了订阅者的onError方法,所以接下来就可以在订阅者中中处理各类error。
~
void askForRegister(String email, String password) { mSubscription = mRegisterUsecase.execute(email, password) .doOnSubscribe(() -> mRegisterView.showLoadingView()).subscribeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<RegisterWrapper.MapData>() { @Override public void onCompleted() { mRegisterView.hideLoadingView(); } @Override public void onError(Throwable e) { e.printStackTrace(); mRegisterView.hideLoadingView(); if (e instanceof ServerErrorException) pareseErrorCode(e.getMessage()); else mRegisterView.showNetWorkErrorSnackbar(); } @Override public void onNext(RegisterWrapper.MapData mapData) { mRegisterView.toSuccess(); mRegisterView.onBackPresseds(); } }); // }
可以看到在订阅者中的onError()中,首先对Throwable进行了比对,看是否是服务器返回错误,pareseErrorCode(e.getMessage)中集中对所有的错误码进行了处理,这里e.getMessage就是自定义Exception时构造中传入的errorcode,至此我们就把处理wrapper的动作剥离出来,在onNext中只处理Entitie了。