我尝试在建立连接时向服务器发送当前时间。我已经知道,对于网络的健康状况,这个时间可能会有一些延迟。 为此,我使用了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>());
答案 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(...)
...