重试RxJava和Retrofit后发送正确的当前时间

时间:2016-12-22 09:31:45

标签: android rx-java observable retrofit2

我尝试在建立连接时向服务器发送当前时间。我已经知道,对于网络的健康状况,这个时间可能会有一些延迟。 为此,我使用了retrofit(2)和rxjava(1),我在重试和重试计数之间有一些延迟,如下所示:

 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 个答案:

答案 0 :(得分:2)

您应该首先了解Observable.just(getCurrentTime())getCurrentTime()序列汇编后执行Observable并且没有拨打电话&#34;神奇地&#34;延迟:

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的用户。

答案 1 :(得分:2)

让我们看看Observable.just的示例:

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

可以改写如下:

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

retry会再次订阅您的Observable,并会重复使用时间值。

要再次计算该值,您必须使用Observable.fromCallable再次计算时间

Observable.fromCallable(() -> getCurrentTime())
          .flatMap(...)
          ...