2017-07-10 14 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(); 

      } 
     })); 

を今、私は2つの順次リクエストを行う必要があるので、私は何をするflatMapを使用していますこの。単純なリクエストでは、新しいコンシューマメソッドを2回呼び出してエラーをキャッチしますが、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(); 

        } 
       }) 
     ); 

あなたが見ることができるように、私は2番目の方法でスロー可能オブジェクトを持っていますが、ない最初で、その最初のクラッシュ場合は、アプリがあまりにもクラッシュします。どのようにして最初のリクエストにthrowableを実装できますか?

ありがとうございます。

答えて

1

すべての未チェックの例外(well, almost all)は、購読メソッドの2番目のコンシューマであるサブスクライバのonErrorハンドラに配信されます。
あなたの場合、ソースgetUserData Observableとマッピング関数flatMapの両方の例外がストリームによって処理され、onErrorハンドラに配信されます。

+0

次に、私のコードは正しく構築されていますか?したがって、Throwableを拡張する2番目のコンシューマは両方のエラーを処理しますか?それは私が理解していることです。 – 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; 
         } 
        } 
       }) 
関連する問題