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ş
相关产品推荐
相关产品推荐

