我需要一个可以在每一分钟和每半分钟发出“ping”的观察者,i。即在9:57:30,9:58:00,8:58:30等。
目前的构建方式如下:
Observable.interval(secondsUntilNextFullOrHalfMinute, 30, TimeUnit.SECONDS);
Subscriber
现在每次发射都有大约400 ms的延迟,延迟时间在10 ms之内:
onNext: 2015-11-17T09:55:30.409
onNext: 2015-11-17T09:56:00.415
onNext: 2015-11-17T09:56:30.415
onNext: 2015-11-17T09:57:00.415
onNext: 2015-11-17T09:57:30.419
onNext: 2015-11-17T09:58:00.402
onNext: 2015-11-17T09:58:30.410
onNext: 2015-11-17T09:59:00.412
onNext: 2015-11-17T09:59:30.415
onNext: 2015-11-17T10:00:00.417
现在我对400ms没有问题 - 我只需要知道如果我让应用程序运行几天,是否会出现累积错误(通过累积偶尔的延迟)或错误是否仍然存在(或多或少)常数。
答案 0 :(得分:2)
RxJava中的周期性时间使用公式来计算排放之间的延迟,这有点说明了执行操作所需的时间:
long runCount;
long started = ...;
public void call() {
action.call();
runCount++;
long nextAbsolute = started + runCount * delay;
long nextDelay = nextAbsolute - System.currentTimeMillis();
worker.schedule(this, nextDelay, TimeUnit.MILLISECONDS);
}
这具有系统currentTimeMillis()
的分辨率以及操作系统唤醒线程的准确程度。
这有点弥补了漂移,但是当currentTimeMillis
发生剧烈变化时,也是最近问题的根源:要么需要更长的时间才能完成下一次执行,要么通过赶上所有“快速连续执行”错过了“机会。