2016-01-28 1 views
2

J'ai une méthode qui crée et fusionne deux Observable<T>.Traitement des erreurs RxJava

private Observable<String> getData() { 

    Observable<String> observable1 = Observable.just("Just string") 
      .delay(2, TimeUnit.SECONDS); 

    Observable<String> observable2 = Observable.create(new Observable.OnSubscribe<String>() { 
     @Override 
     public void call(Subscriber<? super String> subscriber) { 
      subscriber.onError(new Exception("Oops!")); 
     } 
    }); 

    Observable<String> merged = observable1.mergeWith(observable2); 

    return merged;   
} 

Le problème est que l'erreur dans le observable2 émis plus tôt que les données contenues dans le observable1.

getData().subscribe(new Observer<String>() { 
      @Override 
      public void onCompleted() { 
       Log.d("rx", "onCompleted"); 
      } 

      @Override 
      public void onError(Throwable e) { 
       Log.d("rx", "onError: " + e.getMessage()); 
      } 

      @Override 
      public void onNext(String s) { 
       Log.d("rx", "onNext: " + s); 
      } 
     }); 

observable2 émis des données facultatives et les erreurs de observable2 ne doit pas mettre fin à l'émission, mais d'autre part, je veux gérer toutes les erreurs et les données dans un seul observateur. Puis-je retourner cette erreur après le résultat du observable1? Est-ce possible?

résultats: Expect

onNext: Just string 
onError: Oops! 

Répondre

3

On dirait que vous avez besoin quelque chose comme Observable.mergeDelayError().

Il applique une opération merge mais si certains des Observables appellent onError, il ne s'arrête pas tout de suite mais capture les erreurs.

Une fois tous les autres observables complétés avec succès, les erreurs sont propagées, éventuellement combinées en un seul CompositeException.

+0

Vous devriez probablement en dire plus sur pourquoi c'est le cas –

+0

Peut-être que ce serait une bonne explication de Observable.mergeDelayError(): https://github.com/dawidgdanski/rx-java-handies/blob/master/src /test/java/io/github/dawidgdanski/sample/rx/observable/MergeContractTest.java#L155 –