You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CountDownTimer未取消问题求助:重复实例化后取消失效

解决CountDownTimer无法取消的问题

嘿,我懂你遇到的麻烦了——每次调用showQuestion都会新建一个CountDownTimer并覆盖掉questionTimer变量,这就导致之前的定时器实例失去了引用。你后面在其他按钮点击方法里调用cancel()时,只能取消当前变量指向的最新定时器,而那些没被处理的旧定时器还在后台偷偷运行,自然就出现了“定时器没取消”的问题。

给你几个关键的解决步骤:

  • 创建新定时器前先清理旧实例:在showQuestion方法开头,先判断questionTimer是否为空,若不为空就先取消它再赋值新的,避免多个定时器同时运行。
  • 确保questionTimer是类成员变量:如果它是局部变量,你在其他按钮的点击方法里根本拿不到这个引用,更别说取消了。
  • 生命周期中也要清理定时器:在页面销毁(比如onDestroy)时,务必取消定时器,避免内存泄漏或者后台继续执行的问题。

修改后的完整代码示例:

// 将questionTimer定义为类的成员变量
private CountDownTimer questionTimer;

public void showQuestion(int questionNumber){
    // 先取消旧的定时器,防止多个实例同时运行
    if (questionTimer != null) {
        questionTimer.cancel();
        questionTimer = null; // 手动置空帮助垃圾回收
    }
    
    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();
}

之后你在其他按钮的点击方法里调用questionTimer.cancel(),就能正确取消当前正在运行的定时器了。另外,记得在页面销毁时添加清理逻辑:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (questionTimer != null) {
        questionTimer.cancel();
    }
}

内容的提问来源于stack exchange,提问作者Hakan Erbaş

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:05:16