CountDownTimer未被取消

时间:2018-04-19 13:56:37

标签: android

我在这里定义了倒计时器。

然后,在onclick方法中为此变量定义了新的countdowntimer:

   public void showQuestion(int questionNumber){
    questionTimer = new CountDownTimer(10500,1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            remainingTime.setText(Long.toString(millisUntilFinished/1000));
        }

        @Override
        public void onFinish() {
            remainingTime.setText("0");
            showCorrectAnswer();
        }
    }.start();
}

然后我在另一个按钮'onclick方法中取消了这个计时器;

    public void selectOption(View view) {
    questionTimer.cancel();
    }

在这个时候,它被成功取消了。然后我再次做同样的事情。 showQuestion方法的工作方式相同。

   public void showQuestion(int questionNumber){
    questionTimer = new CountDownTimer(10500,1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            remainingTime.setText(Long.toString(millisUntilFinished/1000));
        }

        @Override
        public void onFinish() {
            remainingTime.setText("0");
            showCorrectAnswer();
        }
    }.start();
}

成功开始。当我想在另一个按钮onclick方法上取消此计时器时,它无法正常工作。没有任何错误。我希望它可以很清楚。非常感谢你。

2 个答案:

答案 0 :(得分:0)

public void selectOption(View view) {
    questionTimer.cancel();
    questionTimer = null;
}

答案 1 :(得分:0)

您的代码的问题是计时器可以在第一个计时器完成或取消之前多次启动(有时不是故意的)。在这种情况下,当您尝试取消它时,您只能取消第一个计时器。要解决此问题,您只需要检查计时器是否正在运行,如果它正在运行,请等待它完成或取消。

定义全局参数:

  

Boolean timerRunning = false;

   public void showQuestion(int questionNumber){
    if (timerRunning) return;
    timerRunning = true;
    questionTimer = new CountDownTimer(10500,1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            remainingTime.setText(Long.toString(millisUntilFinished/1000));
        }

        @Override
        public void onFinish() {
            remainingTime.setText("0");
            showCorrectAnswer();
            timerRunning = false;
        }
    }.start();
}

您的选择选项方法可以更改为:在取消之前检查计时器是否为空。

public void selectOption(View view) {
    if (questionTimer != null) questionTimer.cancel();
    timerRunning = false;

}