Kotlin中如何设置支持用户自定义时长的CountDownTimer,解决时长修改不生效问题
问题原因
CountDownTimer的构造参数为值传递,你在全局初始化timer实例时,已经用初始值time=5计算出总时长5000ms存入实例内部,后续修改time变量不会改变已创建实例的内置计时参数,所以每次启动都只会倒计时5秒。
解决方案
你需要在每次获取到用户输入的最新时长后,再创建新的CountDownTimer实例启动,修改逻辑如下:
- 先将全局的计时器变量改为可空类型,取消提前初始化的逻辑:
var timer: CountDownTimer? = null
- 修改点击事件逻辑,每次启动前先销毁旧计时器,再用最新时长创建新实例:
bntTimer.setOnClickListener(){ if(TextUtils.isEmpty(etTime.text)) { Toast.makeText(this, "Por favor, informe o tempo.", Toast.LENGTH_SHORT).show(); } else{ // 终止之前运行的计时器,避免冲突和内存泄漏 timer?.cancel() val time = etTime.text.toString().toLong() // 用最新时长创建新的计时器实例 timer = object : CountDownTimer(time * 1000, 1000) { override fun onTick(millisUntilFinished: Long) { bntTimer.text = (millisUntilFinished / 1000).toString() if (!on) turnOn() } override fun onFinish() { bntTimer.text = "Timer" if (on) turnOff() } } Toast.makeText(this@MainActivity, "Timer Contando", Toast.LENGTH_SHORT).show() timer.start() } }
注意:页面销毁时需要调用
timer?.cancel()主动停止计时器,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Arthur _
相关产品推荐
相关产品推荐

