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

Kotlin中给CountDownTimer传递初始时间不生效问题排查

问题根因

你在类成员变量位置直接初始化CountDownTimer时,initTime还处于初始赋值的0状态,后续你动态修改initTime的值不会同步到已经创建完成的CountDownTimer实例中,因为构造函数的参数仅在实例初始化时生效,不会随变量后续变更自动更新。

解决方案

步骤1:修改倒计时实例的声明逻辑

不要在成员变量位置直接初始化CountDownTimer,改为先声明可空类型,等initTime赋值完成后再创建实例:

// 替换原来的成员变量初始化代码
private var countDownTimer: CountDownTimer? = null

步骤2:在initTime赋值完成后再创建并启动倒计时

在setupBoard方法中给initTime赋值后,调用初始化倒计时的方法:

@SuppressLint("SetTextI18n")
private fun setupBoard() {
    supportActionBar?.title = gameName ?: getString(R.string.app_name)
    supportActionBar?.subtitle = "Memory Game"

    when (boardSize){
        BoardSize.EASY -> {
            tvNumMoves.text = getString(R.string.Easy4x2)
            tvNumPairs.text = boardSize.getTime().toString() + ":00"
            initTime = boardSize.getTime().toLong()
        }
        BoardSize.MEDIUM -> {
            tvNumMoves.text = getString(R.string.Medium6x3)
            tvNumPairs.text = boardSize.getTime().toString() + ":00"
            initTime = boardSize.getTime().toLong()
        }
        BoardSize.HARD -> {
            tvNumMoves.text = getString(R.string.Hard6x4)
            tvNumPairs.text = boardSize.getTime().toString() + ":00"
            initTime = boardSize.getTime().toLong()
        }
    }
    // 新增:初始化并启动倒计时
    initAndStartCountDown()
}

步骤3:实现倒计时初始化方法

封装单独的倒计时初始化逻辑,每次创建新实例前先取消旧实例避免冲突:

private fun initAndStartCountDown() {
    // 先取消正在运行的旧倒计时,避免多实例冲突
    countDownTimer?.cancel()
    // 用最新的initTime创建新的倒计时实例
    countDownTimer = object: CountDownTimer(initTime*1000, 100) {
        override fun onTick(millisUntilFinished: Long) {
            timeLeft = millisUntilFinished
            timeResult =
                "${(millisUntilFinished / 1000 % 60).toString().padStart(2, '0')}:" +
                "${(millisUntilFinished / 100 % 60).toString().padStart(2, '0')} "
            tvNumPairs.text = "$timeResult"
        }

        override fun onFinish() {
            // 自行补充倒计时结束后的逻辑
            tvNumPairs.text = "00:00"
        }
    }
    // 启动倒计时
    countDownTimer?.start()
}
注意事项
  • 页面销毁时要主动取消倒计时,避免内存泄漏:
override fun onDestroy() {
    super.onDestroy()
    countDownTimer?.cancel()
}

内容的提问来源于stack exchange,提问作者Eric Low

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:54:04