簡體   English   中英

如何在RxJava2的flatMap中進行Throwable調用?

[英]How to do a Throwable call in a flatMap in RxJava2?

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

謝謝。

所有未檢查的異常( 很好,幾乎所有 )都將傳遞給訂閱者中的onError處理程序,該訂閱者是您的subscription方法中的第二個Consumer。
因此,在您的情況下,源getUserData Observable中的異常和flatMap映射函數都將由流處理,並將被傳遞給onError處理程序。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM