2016-04-17 19 views
0

Observableを再購読してエラーを取得できますか?エラーを受け取り、再投稿

Observable<T> retry()メソッドはobservableを再サブスクライブしますが、エラーが発生します。 .retry()がエラーを消費するため

final PublishSubject<Integer> observable = PublishSubject.create(); 
observable 
    .flatMap(new Func1<Integer, Observable<Integer>>() { 

     @Override 
     public Observable<Integer> call(final Integer integer) { 
      if (integer % 2 == 0) { 
       return Observable.just(integer); 
      } else { 
       return Observable.error(new Exception("int: " + integer)); 
      } 
     } 
    }) 
    .retry() 
    .subscribe(new Action1<Integer>() { 

        @Override 
        public void call(final Integer integer) { 
         Timber.i("integer: %d", integer); 
        } 
       }, 
       new Action1<Throwable>() { 

        @Override 
        public void call(final Throwable throwable) { 
         Timber.e(throwable, "throwable"); 
        } 
       }, 
       new Action0() { 

        @Override 
        public void call() { 
         Timber.w("onCompleted"); 
        } 
       }); 

Observable 
    .range(0, 10) 
    .delay(2, TimeUnit.MILLISECONDS) 
    .subscribe(new Action1<Integer>() { 

        @Override 
        public void call(final Integer integer) { 
         observable.onNext(integer); 
        } 
       }, 
       new Action1<Throwable>() { 

        @Override 
        public void call(final Throwable throwable) { 
         observable.onError(throwable); 
        } 
       }, 
       new Action0() { 

        @Override 
        public void call() { 
         observable.onCompleted(); 
        } 
       }); 

observableonError一部が呼び出されることはありません。

答えて

1

あなたが探しているのはretryWhen()です。これにより、Throwableを提供するFunc1を渡すことができます。つまり、代わりにonErrorロジックを配置することができます。

これは良いarticleです。