RxJava:长时间运行的“间隔”是否存在累积错误?

时间:2015-11-17 09:03:15

标签: rx-java

我需要一个可以在每一分钟和每半分钟发出“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没有问题 - 我只需要知道如果我让应用程序运行几天,是否会出现累积错误(通过累积偶尔的延迟)或错误是否仍然存在(或多或少)常数

1 个答案:

答案 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发生剧烈变化时,也是最近问题的根源:要么需要更长的时间才能完成下一次执行,要么通过赶上所有“快速连续执行”错过了“机会。