2016-12-22 8 views
0

연결이 설정된 시간에 현재 시간을 서버에 보내려고합니다. 나는이 시간이 네트워크의 상태와 관련하여 약간의 대기 시간을 가질 수 있음을 이미 알고 있습니다. 이를 위해 , 나는 개조 (2) rxjava (1)을 사용하고, 나는 시도하고 재시도 횟수 사이에 약간의 지연이 같은있다 :재시도 후 올바른 현재 시간 보내기 RxJava 및 Retrofit

내 문제가
mRetrofit = new ApiClient().getObservableClient(); 
mService = mRetrofit.create(ApiObservableService.class); 

mService.sendServerTimeNow(getCurrentTime()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.io()) 
      .retryWhen(«new RetryWithDelay(retries, delay)) 
      .subscribe(new CustomSubscriber<ResponseBody>()); 

, 때마다 재 시도입니다 만든 경우 getCurrentTime()은 새로 고치지 않고 해당 값은 구독시 항상 동일합니다.

E.g. 
Retry 1 - 1482399029862 
Retry 2 - 1482399029862 //here should be changed to the new current time 
Retry 3 - 1482399029862 //here should be changed to the new current time 

나는 다시 구독 할 시도 벌채가 있고, 이것이 사실이라면 현재 시간을 새로 고칠 생각되지 않는 이유는 무엇입니까?

이 내 getCurrentTime이다()

public long getCurrentTime(){ 
    return System.currentTimeMillis(); 
} 

어떻게 현재 시간의 새로 고침을 수행 할 수 있습니다?

또한, 이미 시도했지만 성공하지 다음 Observable 순서는 조립과 통화를하지 않는 경우

Observable.just(getCurrentTime()) 
     .flatMap(new Func1<Long, Observable<ResponseBody>>() { 
      @Override 
      public Observable<ResponseBody> call(Long aLong) { 
       mService.sendServerTimeNow(aLong) 
      } 
     }) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribeOn(Schedulers.io()) 
     .retryWhen(«new RetryWithDelay(retries, delay)) 
     .subscribe(new CustomSubscriber<ResponseBody>()); 

답변

2

가 먼저 Observable.just(getCurrentTime())getCurrentTime()을 실행하는 것을 이해한다 "마술"연기 :

final long now = getCurrentTime(); 

Observable<Long> o = Observable.just(now); 

o.test().assertResult(now); // "now" is set in stone inside the Observable 
o.test().assertResult(now); 
o.test().assertResult(now); 

retry을 포함하여 수신 가입자마다 getCurrentTime만을 호출하는 Observable.fromCallable(() -> getCurrentTime())을 대신 사용할 수 있습니다. Observable.just와 예제를

+0

에 대한 Observable.fromCallable를 사용하여, 다시 시간을 계산해야합니다, 다시 값을 계산 해설 주셔서 감사합니다. 고마워요. – iGoDa

2

살펴 보자 :

Observable.just(getCurrentTime()) 
      .flatMap(...) 
      ... 

은 다음과 같이 쓸 수있다 :

Long time = getCurrentTime() 
Observable.just(time) 
      .flatMap(...) 
      ... 

retryObservable에 다시 가입하고 시간의 가치를 다시 사용합니다.

, 나는 단지와 fromCallable의 차이를 알고하지 않았다 예를

Observable.fromCallable(() -> getCurrentTime()) 
      .flatMap(...) 
      ... 
관련 문제