2016-12-27 20 views
5

Retrofit2 ile birlikte RxJava ve RxAndroid kullanıyorum.RxJava: Zip operatörü ile hata nasıl ele alınır?

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

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

aşağıdaki Observer ikiden fazla fermuar operatörü kullanılması.

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

herhangi bir hata varsa o zaman doğrudan testDataObservable ait abone onError yöntemini çağıracak responseOneObservable ve responseTwoObservable uyarlanmasında http arama sırasında oluşur.

Gözlemlenebilir iki başarıdan biri olsa bile, zip operatörünün call yöntemine devam etmek istiyorum.

zip numaralı telefonu kullanarak hata yanıtını nasıl ele alırım?

+0

1 OnErrorResumeNext'in bunu yapmanıza izin vermesi gerektiğine inanıyorum. –

cevap

3

Sen gibi zip için bazı varsayılan değeri döndürmek için veya onErrorReturn bazı gözlemlenebilir dönmek için onErrorResumeNext kullanabilirsiniz bkz:

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

fazla bilgi için onError handling bakınız.

0

onErrorResumeNext'u, tek bir hata durumunda, varsayılan bir öğenin hata durumunda yayılmasını sağlamak için kullanmanız gerekir.

Error-Handling-Operators

1

için Sen onErrorResumeNext operatörle iki gözlenebilirlerin birinden varsayılan yanıtı dönebilirsiniz bakın.

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

Ayrıca Error handling in RxJava - Dan Lew

İlgili konular