如何在RxJava2中的flatMap中进行Throwable调用?

时间:2017-07-10 10:06:54

标签: android retrofit2 rx-java2

我正在使用RxJava2,我正在做简单的请求,我应该像下一个例子那样做:

getCompositeDisposable().add(subscriptionManager.getSubscriptions(getUserAuth().getToken()).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<HttpCustomRes<List<GetSubscriptions>>>() {
            @Override
            public void accept(@NonNull HttpCustomRes<List<GetSubscriptions>> listHttpCustomRes) throws Exception {

                getMvpView().hideLoading();

                ErrorCode errorCaught = bypassForErrors(listHttpCustomRes.getError());

                if(errorCaught.equals(ErrorCode.SUCCESSFUL_REPSONSE))
                    getMvpView().showSubscriptions(listHttpCustomRes.getData());
                else if(errorCaught.equals(ErrorCode.INVALID_TOKEN) || errorCaught.equals(ErrorCode.NULL_TOKEN))
                    getMvpView().showLogin();
                else
                    getMvpView().showErrorDialog();

            }
        }, new Consumer<Throwable>() {
            @Override
            public void accept(@NonNull Throwable throwable) throws Exception {

                getMvpView().hideLoading();
                getMvpView().showErrorDialog();

            }
        }));

现在,我需要做两个顺序请求,所以我使用flatMap来做这个。在简单的请求中,我第二次调用方法new Consumer来捕获错误,但是使用flatMap我不知道如何做到这一点。我将代码发布在下一行。

getCompositeDisposable().add(accountUserManager.getUserData(getUserAuth().getToken()).flatMap(new Function<UserData, Flowable<HttpCustomRes<List<GetSubscriptions>>>>() {
                    @Override
                    public Flowable<HttpCustomRes<List<GetSubscriptions>>> apply(@NonNull UserData userData) throws Exception {

                        setUserData(userData);

                        return subscriptionManager.getSubscriptions(getUserAuth().getToken());
                    }
                }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<HttpCustomRes<List<GetSubscriptions>>>() {
                    @Override
                    public void accept(@NonNull HttpCustomRes<List<GetSubscriptions>> listHttpCustomRes) throws Exception {

                        getMvpView().hideLoading();

                        ErrorCode errorCaught = bypassForErrors(listHttpCustomRes.getError());

                        if(errorCaught.equals(ErrorCode.SUCCESSFUL_REPSONSE))
                            getMvpView().showSubscriptions(listHttpCustomRes.getData());
                        else if(errorCaught.equals(ErrorCode.INVALID_TOKEN) || errorCaught.equals(ErrorCode.NULL_TOKEN))
                            getMvpView().showLogin();
                        else
                            getMvpView().showErrorDialog();

                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(@NonNull Throwable throwable) throws Exception {

                        getMvpView().hideLoading();
                        getMvpView().showErrorDialog();

                    }
                })
        );

正如你所看到的,我在第二种方法中有一个throwable,但在第一种方法中没有,所以如果第一次崩溃,应用程序也会崩溃。如何将throwable实现到第一个请求?

谢谢。

2 个答案:

答案 0 :(得分:1)

所有未经检查的异常(well, almost all)将被发送到订阅者中的onError处理程序,该订阅者是订阅方法中的第二个消费者。
因此,在您的情况下,源getUserData Observable和flatMap映射函数中的两个异常都将由流处理,并将传递给onError处理程序。

答案 1 :(得分:0)

 new Consumer<Throwable>() {
                    @Override
                    public void accept(@NonNull Throwable throwable) throws Exception {
                        try{
                        getMvpView().hideLoading();
                        getMvpView().showErrorDialog();
                        }catch(Exception e){
                            throw e;
                        }
                    }
                })