2017-07-10 5 views
0

Ich bin mit RxJava2 arbeiten und ich war einfache Anfrage zu machen, ich soll es wie das nächste Beispiel tun:Wie führe ich einen Throwable Call in einer FlatMap in RxJava2 durch?

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(); 

      } 
     })); 

Nun, ich brauche zwei aufeinanderfolgende Anforderung zu tun, so dass ich den flatMap mit tun Dies. In der einfachen Anfrage habe ich den zweiten Aufruf der Methode neuer Consumer, um Fehler zu erkennen, aber mit der FlatMap weiß ich nicht wie ich das machen soll. Ich poste den Code in den nächsten Zeilen.

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(); 

        } 
       }) 
     ); 

Wie Sie sehen können, habe ich eine throwable in der zweiten Methode, aber nicht in dem ersten, so dass, wenn der ersten Absturz, die App wird auch zum Absturz bringen. Wie kann ich das Throwable auf die erste Anfrage umsetzen?

Vielen Dank.

Antwort

1

Alle nicht geprüften Ausnahmen (well, almost all) werden an den Handler onError des Abonnenten gesendet, der in Ihrer Subscribe-Methode der zweite Consumer ist.
In diesem Fall werden sowohl die Ausnahme in der Quelle getUserData Observable als auch die flatMap Mapping-Funktion vom Stream verarbeitet und an den Handler onError übermittelt.

+0

Dann ist mein Code gut aufgebaut? Also wird der zweite Verbraucher, der das Throwable erweitert, mit den beiden möglichen Fehlern umgehen? Es ist, was ich verstehe. – MAOL

+0

Ja, das stimmt – yosriz

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