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

