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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:35:39