RxJava:long 运行 `intervals` 是否存在累积错误?
RxJava: Is there a cumulative error on long running `intervals`?
我需要一个每整分钟和半分钟发出一个 "ping" 的 Observable,我。 e.在 9:57:30、9:58:00、8:58:30 等
目前的构造是这样的:
Observable.interval(secondsUntilNextFullOrHalfMinute, 30, TimeUnit.SECONDS);
并且 Subscriber
现在每次发射都有大约 400 毫秒的延迟,并且彼此之间的延迟在 10 毫秒以内:
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 没问题了 - 我只需要知道 如果我离开应用程序 运行 几天,是否会出现累积错误(通过累积偶尔延迟)还是错误会保持(或多或少)不变.
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()
的分辨率以及您的 OS 唤醒线程的准确度。
这在一定程度上弥补了漂移,但也是最近 currentTimeMillis
发生巨大变化时出现问题的根源:要么需要更长的时间才能获得下一次执行,要么它们通过赶上所有 "missed" 个机会。
我需要一个每整分钟和半分钟发出一个 "ping" 的 Observable,我。 e.在 9:57:30、9:58:00、8:58:30 等
目前的构造是这样的:
Observable.interval(secondsUntilNextFullOrHalfMinute, 30, TimeUnit.SECONDS);
并且 Subscriber
现在每次发射都有大约 400 毫秒的延迟,并且彼此之间的延迟在 10 毫秒以内:
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 没问题了 - 我只需要知道 如果我离开应用程序 运行 几天,是否会出现累积错误(通过累积偶尔延迟)还是错误会保持(或多或少)不变.
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()
的分辨率以及您的 OS 唤醒线程的准确度。
这在一定程度上弥补了漂移,但也是最近 currentTimeMillis
发生巨大变化时出现问题的根源:要么需要更长的时间才能获得下一次执行,要么它们通过赶上所有 "missed" 个机会。