From 3cd12a515562b278c05dff88324f254995a60e9e Mon Sep 17 00:00:00 2001 From: jl1990 Date: Wed, 7 Aug 2013 17:39:22 +0200 Subject: [PATCH] Fixed cancel() not working correctly The method handleMessage(Message msg) from mHandler variable was not checking if the timer was cancelled, so sendMessageDelayed(obtainMessage(MSG), delay) was keeping the timer alive. The patch simply adds a boolean and checks if the CountDownTimer was cancelled before calling sendMessageDelayed(obtainMessage(MSG), delay) bug: https://code.google.com/p/android/issues/detail?id=58668 Change-Id: Ic6bbb9d33a3616f8503db222513cc14ad2270cb8 Signed-off-by: jl1990 --- core/java/android/os/CountDownTimer.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/java/android/os/CountDownTimer.java b/core/java/android/os/CountDownTimer.java index 15e6405b1d22f..58acbcf5684ba 100644 --- a/core/java/android/os/CountDownTimer.java +++ b/core/java/android/os/CountDownTimer.java @@ -16,8 +16,6 @@ package android.os; -import android.util.Log; - /** * Schedule a countdown until a time in the future, with * regular notifications on intervals along the way. @@ -56,6 +54,11 @@ public abstract class CountDownTimer { private final long mCountdownInterval; private long mStopTimeInFuture; + + /** + * boolean representing if the timer was cancelled + */ + private boolean mCancelled = false; /** * @param millisInFuture The number of millis in the future from the call @@ -72,7 +75,8 @@ public abstract class CountDownTimer { /** * Cancel the countdown. */ - public final void cancel() { + public synchronized final void cancel() { + mCancelled = true; mHandler.removeMessages(MSG); } @@ -80,6 +84,7 @@ public abstract class CountDownTimer { * Start the countdown. */ public synchronized final CountDownTimer start() { + mCancelled = false; if (mMillisInFuture <= 0) { onFinish(); return this; @@ -112,6 +117,10 @@ public abstract class CountDownTimer { public void handleMessage(Message msg) { synchronized (CountDownTimer.this) { + if (mCancelled) { + return; + } + final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime(); if (millisLeft <= 0) {