2014-10-07 14 views
15

Ho 5 Observable s che sono concatenati con flatMap. Nel caso in cui i primi quattro Observable s producano un Exception Voglio propagare un diverso tipo di Exception al quinto.RxJava concatenamento degli osservabili e gestione degli errori (propagazione delle eccezioni personalizzate)

Come è stato realizzato?

Grazie.

P.S. Mi è venuta in mente questa soluzione ancora sottoposti a verifica:

flatMap(
     // onNext 
     new Func1<BoolResponse, Observable<?>>() { 
      @Override 
      public Observable<?> call(BoolResponse boolResponse) { 
       return request; 
      } 
     }, 
     // onError 
     new Func1<Throwable, Observable<?>>() { 
      @Override 
      public Observable<?> call(Throwable throwable) { 
       return Observable.error(new SomethingWentWrong()); 
      } 
     }, 
     // onCompleted 
     new Func0<Observable<?>>() { 
      @Override 
      public Observable<?> call() { 
       return request; 
      } 
}); 

pensi che è OK?

risposta

27

Quello che stai cercando è onErrorResumeNext che vi permetterà di catturare qualsiasi Throwable emesso dalla sorgente e consente di riprendere sia con un nuovo osservabili o un'altra Observable che emettono un diverso Throwable.

... 
    .flatMap(...) 
    .flatMap(...) 
    .onErrorResumeNext(new Func1<Throwable, Observable<?>>() { 
     @Override 
     public Observable<?> call(Throwable throwable) { 
      // Here simply return an Observable which will emit the Throwable of your liking 
      return Observable.error(new Throwable(...)); 
     } 
    }) 
    .flatMap(...); 

Tenete a mente che flatMap è un operatore per gestire il vostro flusso di dati, ma non vi permetterà di gestire onError ha nel tuo esempio di codice. È possibile gestire l'errore nella richiamata onErroronError in cui si effettua la registrazione allo stream.