2016-12-27 24 views
5

Tôi đang sử dụng RxJava và RxAndroid với Retrofit2.RxJava: Cách xử lý lỗi với toán tử nén?

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

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

Sử dụng toán tử zip như dưới đây trên hai Trình theo dõi.

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

Nếu có bất kỳ lỗi xảy ra trong quá retrofit gọi http trong responseOneObservableresponseTwoObservable sau đó nó sẽ trực tiếp gọi onError phương pháp của thuê bao của testDataObservable.

Tôi muốn tiếp tục phương thức call của nhà khai thác zip ngay cả khi bất kỳ ai trong hai quan sát đều có phản hồi thành công.

Cách xử lý phản hồi lỗi bằng cách sử dụng toán tử zip?

+0

Tôi tin rằng 'onErrorResumeNext' sẽ cho phép bạn thực hiện việc này. –

Trả lời

3

Bạn có thể sử dụng onErrorResumeNext trở lại một số Quan sát hoặc onErrorReturn trở lại một số giá trị mặc định để zip, như:

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

Xem onError handling để biết thêm.

0

Bạn nên sử dụng onErrorResumeNext đối với các quan sát nén duy nhất để hướng dẫn chúng phát ra một mục mặc định trong trường hợp có lỗi.

Tham khảo Error-Handling-Operators

1

Bạn có thể trả về phản hồi mặc định từ một trong hai quan sát với onErrorResumeNext điều hành.

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

Xem thêm Error handling in RxJava - Dan Lew

Các vấn đề liên quan