2017-07-10 85 views
0

我與RxJava2工作,我在做簡單的要求,我應該這樣做像下面的例子:如何在RxJava2的flatMap中執行Throwable調用?

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做這個。在簡單的請求中,我有第二次調用新的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?

謝謝。

回答

1

所有未經檢查的異常(well, almost all)將交付到訂閱者中的onError處理程序,該訂閱者是訂閱方法中的第二個使用者。
因此,在您的情況下,來源getUserData Observable和flatMap映射函數中的異常都將由流處理,並將傳遞到onError處理程序。

+0

然後,我的代碼是精心構造的?那麼,擴展Throwable的第二個消費者將會處理這兩種可能的錯誤?這是我的理解。 – MAOL

+0

是的,那是真的 – yosriz

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