2016-12-27 4 views
5

Ich benutze RxJava und RxAndroid mit Retrofit2.RxJava: Wie Fehler mit Zip-Operator umgehen?

Observable<ResponseOne> responseOneObservable = getRetrofitClient().getDataOne() 
.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()); 

Observable<ResponseTwo> responseTwoObservable = getRetrofitClient().getDataTwo() 
.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()); 

Verwendung von Zip-Operator wie unten auf zwei Observer.

Observable<ArrayList<TestData>> testDataObservable = Observable.zip(responseOneObservable, responseTwoObservable, new Func2<ResponseOne, ResponseTwo, ArrayList<TestData>>() { 
      @Override 
       public ArrayList<TestData> call(ResponseOne responseOne, ResponseTwo responseTwo) { 
        ArrayList<TestData> testDataList = new ArrayList(); 
         // Add test data from response responseOne & responseTwo 
        return testDataList; 
      } 
    }) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(new Subscriber<ArrayList<TestData>>() { 

     @Override 
     public void onNext(ArrayList<TestData> testDataList) { 

     } 

     @Override 
     public void onCompleted() { 
      Log.d(TAG, "onCompleted"); 
     } 

     @Override 
     public void onError(Throwable t) { 
      Log.d(TAG, "onError Throwable: " + t.toString()); 
     } 
    }); 

Wenn es ein Fehler tritt beim Umrüsten http Aufruf in responseOneObservable und responseTwoObservable dann wird es direkt onError Methode der Teilnehmer von testDataObservable nennen.

Ich möchte in call Methode von Zip-Operator fortsetzen, auch wenn jemand von zwei beobachtbaren Erfolg Antwort erhalten hat.

Wie wird die Fehlerreaktion mit dem Operator zip gehandhabt?

+0

Ich glaube, 'onErrorResumeNext' sollte Ihnen erlauben, dies zu tun. –

Antwort

3

Sie onErrorResumeNext verwenden können einige beobachtbare oder onErrorReturn zurückzukehren einige Standardwert zip zurückzukehren, wie:

Observable.zip(
    responseOneObservable 
     .onErrorReturn(new Func1<Throwable, ResponseOne>() { 
     @Override 
     public ResponseOne call(final Throwable throwable) { 
      return new ResponseOne(); 
     } 
    }), 
    responseTwoObservable 
     .onErrorReturn(new Func1<Throwable, ResponseTwo>() { 
     @Override 
     public ResponseTwo call(final Throwable throwable) { 
      return new ResponseTwo(); 
     } 
    }), 
    ... 

onError handling Info für mehr sehen.

0

Sie sollten onErrorResumeNext über die einzelnen gezippten Observablen verwenden, um sie anzuweisen, im Fehlerfall ein Standardelement auszugeben.

Siehe Error-Handling-Operators

1

Sie Standard-Antwort von einem der beiden Observablen mit onErrorResumeNext Operator zurückkehren kann.

Observable<ResponseOne> responseOneObservable = getRetrofitClient().getDataOne() 
    .onErrorResumeNext(throwable -> {/*some default value*/}) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()); 

Observable<ResponseTwo> responseTwoObservable = getRetrofitClient().getDataTwo() 
    .onErrorResumeNext(throwable -> {/*some default value*/}) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()); 

Siehe auch Error handling in RxJava - Dan Lew

Verwandte Themen