From 67cae348ece850b7e89f58714c5c4f9a4f651d5a Mon Sep 17 00:00:00 2001 From: Kirk Shoop Date: Tue, 6 May 2014 07:57:35 -0700 Subject: [PATCH] fix to remove drift from schedulePeriodic --- rxjava-core/src/main/java/rx/Scheduler.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rxjava-core/src/main/java/rx/Scheduler.java b/rxjava-core/src/main/java/rx/Scheduler.java index 1d45006649..2aa3017476 100644 --- a/rxjava-core/src/main/java/rx/Scheduler.java +++ b/rxjava-core/src/main/java/rx/Scheduler.java @@ -99,15 +99,16 @@ public abstract static class Worker implements Subscription { */ public Subscription schedulePeriodically(final Action0 action, long initialDelay, long period, TimeUnit unit) { final long periodInNanos = unit.toNanos(period); + final long startInNanos = TimeUnit.MILLISECONDS.toNanos(now()) + unit.toNanos(initialDelay); final Action0 recursiveAction = new Action0() { + long count = 0; @Override public void call() { if (!isUnsubscribed()) { - long startedAt = now(); action.call(); - long timeTakenByActionInNanos = TimeUnit.MILLISECONDS.toNanos(now() - startedAt); - schedule(this, periodInNanos - timeTakenByActionInNanos, TimeUnit.NANOSECONDS); + long nextTick = startInNanos + (++count * periodInNanos); + schedule(this, nextTick - TimeUnit.MILLISECONDS.toNanos(now()), TimeUnit.NANOSECONDS); } } };