取消 android CountDownTimer
Cancelling an android CountDownTimer
在我的应用程序中,我使用了 CountDownTimer,并希望用户能够重置应用程序中的数据并重新开始。我遇到的问题是,如果您在 3 分钟后启动一个计时器,然后在短时间后调用我的重置功能将所有分数设置回其初始值,然后在 10 分钟后启动一个新计时器。 ... 计时器立即从停止的地方开始说 2:24、2:23、2:22.....
我到处阅读的所有内容都说你调用 countdowntimername.cancel();然后设置 countdowntimername = null;
我就是这样做的,但根本不起作用。必须有更有效的方法来杀死这些计时器吗?有什么想法吗?
酱料:
private void toggleTimer() {
if (timerStarted == false) {
final CountDownTimer countDownTimer = new CountDownTimer(startTime, interval) {
public void onTick(long millisUntilFinished) {
if (timerPaused == true) {
cancel();
} else {
timeRemaining = millisUntilFinished;
long remainder = millisUntilFinished;
minuteTens = df.format(millisUntilFinished / 600000);
remainder = remainder - (Integer.valueOf(minuteTens) * 600000);
minuteOnes = df.format(remainder / 60000);
remainder = remainder - (Integer.valueOf(minuteOnes) * 60000);
secondTens = df.format(remainder / 10000);
remainder = remainder - (Integer.valueOf(secondTens) * 10000);
secondOnes = df.format(remainder / 1000);
setCountdownText();
}
}
public void onFinish() {
minuteTens = "0";
minuteOnes = "0";
secondTens = "0";
secondOnes = "0";
setCountdownText();
timerStarted = false;
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(1000);
}
}.start();
timerStarted = true;
} else {
if (timerPaused == false) {
pauseTimer();
} else {
resumeTimer();
}
}
}
还有:
private void resumeTimer() {
timerPaused = false;
startTime = timeRemaining;
CountDownTimer countDownTimer = new CountDownTimer(startTime, interval) {
public void onTick(long millisUntilFinished) {
if (timerPaused == true) {
cancel();
} else {
timeRemaining = millisUntilFinished;
long remainder = millisUntilFinished;
minuteTens = df.format(millisUntilFinished / 600000);
remainder = remainder - (Integer.valueOf(minuteTens) * 600000);
minuteOnes = df.format(remainder / 60000);
remainder = remainder - (Integer.valueOf(minuteOnes) * 60000);
secondTens = df.format(remainder / 10000);
remainder = remainder - (Integer.valueOf(secondTens) * 10000);
secondOnes = df.format(remainder / 1000);
setCountdownText();
}
}
public void onFinish() {
minuteTens = "0";
minuteOnes = "0";
secondTens = "0";
secondOnes = "0";
setCountdownText();
timerStarted = false;
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(1000);
}
}.start();
}
及重置方法:
private void resetScores() {
final TextView P1CountDownTimer = (TextView) findViewById(R.id.P1CountDownTimer);
final TextView P2CountDownTimer = (TextView) findViewById(R.id.P2CountDownTimer);
timerStarted = false;
timerPaused = false;
minuteTens = "0";
minuteOnes = "0";
secondTens = "0";
secondOnes = "0";
if (countDownTimer != null) {
countDownTimer.cancel();
countDownTimer = null;
}
setCountdownText();
P1CountDownTimer.setVisibility(View.INVISIBLE);
P2CountDownTimer.setVisibility(View.INVISIBLE);
}
编辑:
这也是相关的。这就是我首先实例化计时器的方式,然后在重置后再次实例化。从用户那里获取数据并将其转换为毫秒以传递给倒数计时器:
private void resetTimer() {
final TextView P1CountDownTimer = (TextView) findViewById(R.id.P1CountDownTimer);
final TextView P2CountDownTimer = (TextView) findViewById(R.id.P2CountDownTimer);
startTime = ((Tens * 60) + (Ones)) * 1000;
timeRemaining = startTime;
if (startTime > 0) {
long remainder = startTime;
minuteTens = df.format(startTime / 600000);
remainder = remainder - (Integer.valueOf(minuteTens) * 600000);
minuteOnes = df.format(remainder / 60000);
remainder = remainder - (Integer.valueOf(minuteOnes) * 60000);
secondTens = df.format(remainder / 10000);
remainder = remainder - (Integer.valueOf(secondTens) * 10000);
secondOnes = df.format(remainder / 1000);
setCountdownText();
P1CountDownTimer.setVisibility(View.VISIBLE);
P2CountDownTimer.setVisibility(View.VISIBLE);
}
}
看起来让它工作的方法是让你的计时器成为全局计时器,然后在全局变量上调用取消。
参见
和
我假设这些方法都在您的 Activity class 中,在这种情况下,您将在 Activity class[= 的顶部声明您的 CountDownTimer 14=]
private CountDownTimer countDownTimer;
然后在其他方法如
中参考它
countDownTimer = new CountDownTimer(startTime, interval) {...}
在我的应用程序中,我使用了 CountDownTimer,并希望用户能够重置应用程序中的数据并重新开始。我遇到的问题是,如果您在 3 分钟后启动一个计时器,然后在短时间后调用我的重置功能将所有分数设置回其初始值,然后在 10 分钟后启动一个新计时器。 ... 计时器立即从停止的地方开始说 2:24、2:23、2:22.....
我到处阅读的所有内容都说你调用 countdowntimername.cancel();然后设置 countdowntimername = null;
我就是这样做的,但根本不起作用。必须有更有效的方法来杀死这些计时器吗?有什么想法吗?
酱料:
private void toggleTimer() {
if (timerStarted == false) {
final CountDownTimer countDownTimer = new CountDownTimer(startTime, interval) {
public void onTick(long millisUntilFinished) {
if (timerPaused == true) {
cancel();
} else {
timeRemaining = millisUntilFinished;
long remainder = millisUntilFinished;
minuteTens = df.format(millisUntilFinished / 600000);
remainder = remainder - (Integer.valueOf(minuteTens) * 600000);
minuteOnes = df.format(remainder / 60000);
remainder = remainder - (Integer.valueOf(minuteOnes) * 60000);
secondTens = df.format(remainder / 10000);
remainder = remainder - (Integer.valueOf(secondTens) * 10000);
secondOnes = df.format(remainder / 1000);
setCountdownText();
}
}
public void onFinish() {
minuteTens = "0";
minuteOnes = "0";
secondTens = "0";
secondOnes = "0";
setCountdownText();
timerStarted = false;
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(1000);
}
}.start();
timerStarted = true;
} else {
if (timerPaused == false) {
pauseTimer();
} else {
resumeTimer();
}
}
}
还有:
private void resumeTimer() {
timerPaused = false;
startTime = timeRemaining;
CountDownTimer countDownTimer = new CountDownTimer(startTime, interval) {
public void onTick(long millisUntilFinished) {
if (timerPaused == true) {
cancel();
} else {
timeRemaining = millisUntilFinished;
long remainder = millisUntilFinished;
minuteTens = df.format(millisUntilFinished / 600000);
remainder = remainder - (Integer.valueOf(minuteTens) * 600000);
minuteOnes = df.format(remainder / 60000);
remainder = remainder - (Integer.valueOf(minuteOnes) * 60000);
secondTens = df.format(remainder / 10000);
remainder = remainder - (Integer.valueOf(secondTens) * 10000);
secondOnes = df.format(remainder / 1000);
setCountdownText();
}
}
public void onFinish() {
minuteTens = "0";
minuteOnes = "0";
secondTens = "0";
secondOnes = "0";
setCountdownText();
timerStarted = false;
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(1000);
}
}.start();
}
及重置方法:
private void resetScores() {
final TextView P1CountDownTimer = (TextView) findViewById(R.id.P1CountDownTimer);
final TextView P2CountDownTimer = (TextView) findViewById(R.id.P2CountDownTimer);
timerStarted = false;
timerPaused = false;
minuteTens = "0";
minuteOnes = "0";
secondTens = "0";
secondOnes = "0";
if (countDownTimer != null) {
countDownTimer.cancel();
countDownTimer = null;
}
setCountdownText();
P1CountDownTimer.setVisibility(View.INVISIBLE);
P2CountDownTimer.setVisibility(View.INVISIBLE);
}
编辑:
这也是相关的。这就是我首先实例化计时器的方式,然后在重置后再次实例化。从用户那里获取数据并将其转换为毫秒以传递给倒数计时器:
private void resetTimer() {
final TextView P1CountDownTimer = (TextView) findViewById(R.id.P1CountDownTimer);
final TextView P2CountDownTimer = (TextView) findViewById(R.id.P2CountDownTimer);
startTime = ((Tens * 60) + (Ones)) * 1000;
timeRemaining = startTime;
if (startTime > 0) {
long remainder = startTime;
minuteTens = df.format(startTime / 600000);
remainder = remainder - (Integer.valueOf(minuteTens) * 600000);
minuteOnes = df.format(remainder / 60000);
remainder = remainder - (Integer.valueOf(minuteOnes) * 60000);
secondTens = df.format(remainder / 10000);
remainder = remainder - (Integer.valueOf(secondTens) * 10000);
secondOnes = df.format(remainder / 1000);
setCountdownText();
P1CountDownTimer.setVisibility(View.VISIBLE);
P2CountDownTimer.setVisibility(View.VISIBLE);
}
}
看起来让它工作的方法是让你的计时器成为全局计时器,然后在全局变量上调用取消。
参见
我假设这些方法都在您的 Activity class 中,在这种情况下,您将在 Activity class[= 的顶部声明您的 CountDownTimer 14=]
private CountDownTimer countDownTimer;
然后在其他方法如
中参考它countDownTimer = new CountDownTimer(startTime, interval) {...}