【问题标题】:How to do a Throwable call in a flatMap in RxJava2?如何在 RxJava2 的 flatMap 中进行 Throwable 调用?
【发布时间】:2017-07-10 10:06:54
【问题描述】:

我正在使用 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?

谢谢。

【问题讨论】:

    标签: android retrofit2 rx-java2


    【解决方案1】:

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

    【讨论】:

    • 那么,我的代码结构合理吗?那么,扩展 Throwable 的第二个消费者将处理这两个可能的错误?这是我的理解。
    【解决方案2】:
     new Consumer<Throwable>() {
                        @Override
                        public void accept(@NonNull Throwable throwable) throws Exception {
                            try{
                            getMvpView().hideLoading();
                            getMvpView().showErrorDialog();
                            }catch(Exception e){
                                throw e;
                            }
                        }
                    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-02
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 2020-09-05
      相关资源
      最近更新 更多