2016-09-30 2 views
2

API에서 두 가지 리소스를 다운로드하기 위해 RxJava 구현과 함께 다음 클래스가 있습니다. api/연결 요구 사항을 충족시키지 못하면 다시 시도하거나 반복 할 수 있도록 몇 가지 rx를 수행합니다. 그러나 retryWhen()는 3 회 이상 시도한 후에 onError()를 발생시킵니다./HELPRxJava는 onError() 메소드에 대해 retryWhen()을 호출합니다.

질문은, 내 코드를 검토하고 내가이 문제를 해결하는 데 도움이 바랍니다.

참고

나는이 두 기사를 읽고에 의해 수신을 구현입니다. article 1, article 2

SplashPresenter.class 내가 수동으로 재 시도 후 throw 가능 객체를 유지하려면 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

그것은 매력처럼 작동합니다. (슬픈, 늦은 응답을 위해) –

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

    } 
} 
관련 문제