2016-12-22 7 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.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シーケンスが組み立てられ、コールが「魔法」延期せないとき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())を持つことができます。

+0

を値を計算するために

私はちょうどとfromCallableの違いを知っていませんでした、解説していただきありがとうございます。ありがとうございます! – iGoDa

2

はのはObservable.justであなたの例を見てみましょう:

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

は以下のように書き換えることができます。

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

retryは、あなたのObservableに再び加入しますと時間の値を再利用します。例えばObservable.fromCallableを使用して、あなたは再び時間を計算する必要があります、再び

Observable.fromCallable(() -> getCurrentTime()) 
      .flatMap(...) 
      ... 
関連する問題