2015-09-18 12 views
5

私は各30秒後付でREST呼び出し実行され、次の観測がありますRxJava:(遅れて)例外と再試行を公開

Subscription subscription = Observable.interval(0, REFRESH_INTERVAL, TimeUnit.SECONDS) 
     .concatMap(new Func1<Long, Observable<Response>>() { 
      @Override 
      public Observable<Response> call(Long time) { 
       return webservice.callRetrofitServiceWithRx(parameter); 
      } 
     }) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new UpdateSuccessAction(), new UpdateErrorAction()); 

それは(特にRESTコールが起こることがあり)は例外をスローします(インターネットに接続していないなど)。

私が達成したい何

(30秒後に再試行)私はUIにエラーメッセージを表示することができるように観察可能で、例外を公開/発しなければならないが、それはアイテムを放出継続すべきです。私が観察が例外を放出し(= NO 30秒で再試行)動作を停止し、特別な動作を定義していない場合は

現在

  • を研究します。

  • リトライ演算子を試すと、例外が飲み込まれて公開されないため、エラーは表示されません。

  • 私はonErrorReturn演算子を試すと例外を処理できますが、私が知る限り再試行はできません。

回避策

私の現在の回避策は、この観測に再加入することですが、私は誰かがよりエレガントな解決策を持っているかどうかを知りたいと思います。

答えて

4

私は例えば、再試行と組み合わせて、(エラーをログに記録するために)あなたの必要性に適合しますdoOnErrorを想定しています:

Subscription subscription = Observable.interval(0, REFRESH_INTERVAL, TimeUnit.SECONDS) 
    .concatMap(new Func1<Long, Observable<Response>>() { 
     @Override 
     public Observable<Response> call(Long time) { 
      return webservice.callRetrofitServiceWithRx(parameter); 
     } 
    }) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .doOnError(new UpdateErrorAction()) 
    .retry() 
    .subscribe(new UpdateSuccessAction()); 
+0

クール、おかげでたくさん! – Christopher

1

を他の回答の助けを借りて解決策を見つけた場合。

最初に、30秒後に再試行を開始するRetryWithDelay-Functionを定義しました。私は、この観測可能チェーンで使用

private static class RetryWithDelay 
    implements Func1<Observable<? extends Throwable>, Observable<?>> { 

    @Override 
    public Observable<?> call(Observable<? extends Throwable> attempts) { 
    return attempts.flatMap(new Func1<Throwable, Observable<?>>() { 
     @Override 
     public Observable<?> call(Throwable throwable) { 
      return Observable.timer(CallBO.REFRESH_INTERVAL_IN_SEC,    } 
    }); 
    } 
} 

Subscription subscription = Observable.interval(0, REFRESH_INTERVAL, TimeUnit.SECONDS) 
.concatMap(new Func1<Long, Observable<Response>>() { 
    @Override 
    public Observable<Response> call(Long time) { 
     return webservice.callRetrofitServiceWithRx(parameter); 
    } 
}) 
.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.doOnError(new UpdateErrorAction()) 
.retryWhen(new RetryWithDelay()) 
.subscribe(new UpdateSuccessAction()); 
関連する問題