2016-12-22 1 views
0

Я пытаюсь отправить серверу текущее время на момент установления соединения. Я уже знаю, что на этот раз может быть какая-то латентность, касающаяся здоровья сети. Для этого я использую переоснащения (2) и rxjava (1), и у меня есть некоторая задержка между повторами и число попыток, что-то вроде этого:Отправить правильное текущее время после повторной попытки RxJava и дооснащение

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

Моя проблема, каждый раз, когда повторная попытка является made, 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.just(getCurrentTime()) выполняет getCurrentTime() когда Observable последовательность сборки и не делает вызов «магически» отложено:

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); 

Вы можете использовать Observable.fromCallable(() -> getCurrentTime()), который будет звонить только по номеру getCurrentTime для каждого входящего абонента, в том числе по retry.

+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(...) 
      ...