TimerTask重复执行问题:回合制游戏退出重进后计数器加速
问题分析与解决方案
没错!你遇到的倒计时跳变问题完全是因为退出游戏时没有停止Timer和TimerTask导致的,这是Timer使用中非常常见的资源泄漏问题。
当你点击退出回到主界面时,原来的游戏界面(比如你的ikinci类对应的Activity/Fragment)并没有被彻底销毁,之前创建的Timer实例还在后台线程里默默执行倒计时操作。等你重新进入游戏,代码又会创建一个新的Timer和TimerTask,现在就有多个Timer同时对同一个倒计时变量进行递减操作——比如两个Timer各减1,界面上就会从60直接跳到58,看起来就是跳变了。
所以解决的核心就是:在退出游戏的生命周期节点(比如Activity的onPause()或onDestroy())中,主动停止Timer并取消TimerTask,彻底清理掉旧的计时任务。
给你一个结合Android生命周期的代码示例,你可以参考调整:
public class ikinciActivity extends AppCompatActivity { private Timer gameTimer; private TimerTask countdownTask; private int remainingTime = 60; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_game_layout); initCountdown(); } private void initCountdown() { // 先确保没有旧的任务在运行 if (gameTimer != null) { gameTimer.cancel(); gameTimer = null; } if (countdownTask != null) { countdownTask.cancel(); countdownTask = null; } remainingTime = 60; // 重置倒计时 gameTimer = new Timer(); countdownTask = new TimerTask() { @Override public void run() { // 必须回到主线程更新UI runOnUiThread(() -> { remainingTime--; // 这里更新你的倒计时UI,比如TextView.setText(String.valueOf(remainingTime)) if (remainingTime <= 0) { // 倒计时结束时也要清理资源 gameTimer.cancel(); countdownTask.cancel(); } }); } }; // 每秒执行一次任务,延迟0秒开始 gameTimer.scheduleAtFixedRate(countdownTask, 0, 1000); } @Override protected void onPause() { super.onPause(); // 退出到后台时停止计时 cleanupTimer(); } @Override protected void onDestroy() { super.onDestroy(); // 界面彻底销毁时再次确保清理 cleanupTimer(); } private void cleanupTimer() { if (gameTimer != null) { gameTimer.cancel(); gameTimer = null; } if (countdownTask != null) { countdownTask.cancel(); countdownTask = null; } } }
额外提醒几个关键点:
- 每次启动倒计时前,先检查并清理旧的Timer和Task,避免重复创建
- TimerTask运行在后台线程,更新UI一定要用
runOnUiThread或者Handler,否则会崩溃(你首次运行正常应该已经处理了,但还是提一下) - 用单独的
cleanupTimer()方法来统一处理资源清理,避免代码重复
这样修改后,退出游戏时旧的计时任务会被彻底终止,重新进入时只会创建一个新的Timer,倒计时就会正常按60-59-58...递减了。
内容的提问来源于stack exchange,提问作者Faruk
相关产品推荐
相关产品推荐

