2016-12-27 5 views
5

Retrofit2でRxJavaとRxAndroidを使用しています。RxJava:Zip演算子でエラーを処理する方法は?

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

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

上記の2つのObserverのようにzip演算子を使用します。

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

何らかのエラーがある場合、それは直接testDataObservableの加入者のonErrorメソッドを呼び出しますresponseOneObservableresponseTwoObservableに改造HTTP呼び出し中に発生します。

2人の観測者のうちいずれかが成功応答を返しても、私はZipオペレータのcallメソッドで続行します。

zip演算子を使用してエラー応答を処理するにはどうすればよいですか?

+0

私は 'onErrorResumeNext'がこれを可能にすると信じています。 –

答えて

3

を参照してください。

0

エラーが発生した場合にデフォルトのアイテムを出力するよう指示するには、単一の圧縮されたオブザーバブルにonErrorResumeNextを使用する必要があります。

はあなたがonErrorResumeNext演算子を持つ2回の観測のいずれかからデフォルトの応答を返すことができるError-Handling-Operators

1

を参照してください。詳細は

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

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

また、あなたが好きな、zipにいくつかのデフォルト値を返すために、いくつかの観測やonErrorReturnを返すためにonErrorResumeNextを使用することができますError handling in RxJava - Dan Lew

関連する問題