2016-09-30 9 views
2

私はAPIから2つのリソースをダウンロードするためにRxJavaの実装で次のクラスを持っています。私はapi /接続の要件を満たしていないときに再試行または繰り返すことができるようにいくつかのrxを行います。しかし、再試行することはできません.Error()を3回以上試してから発射してください。/HELPRxJavaはonError()メソッドにretryWhen()を呼び出します

質問は、私のコードを確認し、私はこの問題を解決してください。私はこの二つの記事を読むことにより、受信を実装してい

NOTE

article 1article 2

SplashPresenter.class私は手動で再試行後にスロー可能オブジェクトを保持するにはflatMap

.flatMap(retryCount -> { 
    if (retryCount >= STOP_RETRY_TIME) { 
     return Observable.error(someException); 
    } 
    return Observable.timer(RETRY_TIMEOUT, TimeUnit.SECONDS); 
})) 

答えて

0

カスタムイベントを発生させる)、retryCountがzipWithオペレータから適切なエラーを伴うObservableを返す指定された制限を超えて

.retryWhen(error -> { 
       Observable<Integer> range = Observable.range(START_RETRY_TIME, STOP_RETRY_TIME); 
       Observable<Observable<Long>> zipWith = error.zipWith(range, (e, i) -> 
         i < STOP_RETRY_TIME ? 
           Observable.timer(i, TimeUnit.SECONDS) : 
           Observable.error(e)); 
       return Observable.merge(zipWith); 
      }); 
+0

大丈夫、私はこれを試し、あなたにフィードバックします。 @ytRinoに感謝します –

+0

@JongzPuangputこんにちは、それ以降は何が起こったのですか? – ytRino

+0

それは魅力のように動作し、thx(遅い応答のためにsry) –

1

Observable.error()を投げていた、以前にも同様のコードを書いた(代わりの

public class SplashPresenter implements SplashContract.Presenter { 

    private static final String TAG = SplashPresenter.class.getName(); 
    private static final int RETRY_TIMEOUT = 10; 
    private static final int STOP_RETRY_TIME = 3; 
    private static final int START_RETRY_TIME = 1; 


    private SplashContract.View mView; 

    @Override 
    public void init(SplashContract.View view) { 
     this.mView = view; 
    } 

    @Override 
    public void onResume() { 

     GetRemoteReceiverRelationshipSpec relationSpec = new GetRemoteReceiverRelationshipSpec(); 
     GetRemoteIncompleteReasonSpec reasonSpec = new GetRemoteIncompleteReasonSpec(); 

     Observable<RepoResult<ArrayList<IncompleteReasonViewModel>>> queryReason = 
       Repository.getInstance().query(reasonSpec); 

     Repository.getInstance().query(relationSpec) 
       .concatMap(result -> queryReason) 
       .repeatWhen(complete -> complete 
         .zipWith(Observable.range(START_RETRY_TIME, STOP_RETRY_TIME), (v, i) -> i) 
         .flatMap(repeatCount -> { 
          Log.i(TAG, "Repeat attempt: " + repeatCount); 
          mView.showLoadingDialog(); 
          return Observable.timer(RETRY_TIMEOUT, 
            TimeUnit.SECONDS); 
         })) 
       .takeUntil(RepoResult::isSuccess) 
       .retryWhen(error -> error 
         .zipWith(Observable.range(START_RETRY_TIME, STOP_RETRY_TIME), (v, i) -> i) 
         .flatMap(retryCount -> { 
          Log.i(TAG, "Retry attempt: " + retryCount); 
          mView.showLoadingDialog(); 
          if (mView.getCommunicator() != null) { 
           mView.getCommunicator().onConnectionFail(retryCount); 
          } 
          return Observable.timer(RETRY_TIMEOUT, 
            TimeUnit.SECONDS); 
         })) 
       .filter(RepoResult::isSuccess) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(
         result -> Log.i(TAG, "onNext()"), 
         err -> { 
          Log.i(TAG, "onError()"); 
          if (mView.getCommunicator() != null) { 
           mView.dismissLoadingDialog(); 
           mView.getCommunicator().onSplashScreeDismissError(); 
          } 
         }, 
         () -> { 
          Log.i(TAG, "onComplete()"); 
          if (mView.getCommunicator() != null) { 
           mView.dismissLoadingDialog(); 
           mView.getCommunicator().onSplashScreenSuccessDismiss(); 
          } 
         } 
       ); 
    } 

    @Override 
    public void onPause() { 

    } 
} 
関連する問題