CountDownTimer与TextView配合使用时时间显示异常问题求助
问题根因分析
- 核心逻辑错误:开始/暂停按钮的点击回调中无条件调用了
setTime()方法,点击暂停时也会重新解析当前TextView显示的时间覆盖剩余时长,直接触发秒数显示异常。 - 字符串截取错误:
setTime()方法中解析秒数的代码str2 = input.substring(4, 5)仅截取了秒数的第二位,比如时间为01:59时仅取到字符9,解析后秒数变为9,就会出现59跳转至09的问题。 - 冗余错误代码:
setTime()最后一行textView.setText(Long.toString(mTimeLeftInMillis));中textView变量未定义,这段代码本身也无实际作用。
修复方案
- 修改按钮点击事件逻辑,只有首次启动计时器前才需要调用
setTime(),暂停流程不需要调用:
mButtonStartPause.setOnClickListener(view -> { if(mTimerRunning) { pauseTimer(); } else { // 仅从未运行状态启动时,读取当前显示的时间设置倒计时时长 setTime(); startTimer(); } });
- 修正
setTime()方法中秒数的截取逻辑,截取索引3到5的字符获取完整两位秒数,同时删除冗余代码:
@SuppressLint("SetTextI18n") private void setTime() { String input = textView1.getText().toString(); String str1 = input.substring(0, 2); // 截取完整两位秒数 String str2 = input.substring(3, 5); long number1 = Long.parseLong(str1); long number2 = Long.parseLong(str2); long sumMillisMin = number1 *60000; long sumMillisSec = number2 *1000; long millisInput = sumMillisMin + sumMillisSec; mStarTimeInMillis = millisInput; mTimeLeftInMillis = mStarTimeInMillis; }
- 可选优化:将CountDownTimer的回调间隔从500ms改成1000ms,避免不必要的频繁刷新。
内容的提问来源于stack exchange,提问作者Alex Kremizon
相关产品推荐
相关产品推荐

