RxJava的初学随笔(三)

  我们在写具体项目的网络请求时,都要在每次请求成功的回调中首先处理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了


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值