安卓倒计时器显示1两秒钟

19

可能是重复问题:
为什么millisUntilFinished无法检测CountDownTimer的确切间隔?

为什么使用CountDownTimer会显示两次“1”?我只想让它平稳倒计时,而不是看起来像在最后一秒挂起了。有人有什么解决这个问题的想法吗?

以下是来自Android开发者页面的代码:

  new CountdownTimer(30000, 1000) {

     public void onTick(long millisUntilFinished) {
         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
     }

     public void onFinish() {
         mTextField.setText("done!");
     }
  }.start();

我创建了一个新项目,并复制粘贴了这段代码,只是为了确保我没有在我的程序中意外犯错。我一直在Tab 10.1上测试它。当我运行它时,它会输出:"5"、"4"、"3"、"2"、"1"、"1"、"done!"。


你应该在 onTick(long) 方法中记录 millisUntilFinished 的值。这是用于更新你的 TextView 的值。 - nicholas.hauschild
1
请查看此链接 - https://dev59.com/-2kw5IYBdhLWcg3wPYIP#47695735 - Vishal Yadav
1个回答

61

CountDownTimer 不是精确的,它会尽可能返回接近1秒(在本例中)的时间,但通常这不足以满足您的需求。

如果您记录 ms 变量,您会发现结果大约为29384等,它永远不会是30000、29000等。当前实现方式无法获得您需要使计数器按预期工作所需的精度。

您可以解决大多数情况下的问题。首先降低间隔以获取比您要输出的更多更新,因此不是1秒而是100毫秒,这应该可以给您一个假象,即1秒倒计时计时器,因为您将每秒至少获得几个更新(最坏情况)。

为了优化这一点,在每个输入上进行四舍五入,并进行简单的检查以查看是否应该执行更新(secondsLeft 已更改),如果已更改,则更新 UI 和 secondsLeft 累加器。此外,建议 onFinish 生成最终结果(0),以防系统出现故障,因为有些东西正在消耗 CPU 周期。

总之,这里是已修改的代码,如果您的系统没有负载过重,这在99.99次中有99次可以正常工作。注意:您可能可以使用250ms,具体取决于您。

 int secondsLeft = 0; 

 new CountDownTimer(30000, 100) {
     public void onTick(long ms) {
         if (Math.round((float)ms / 1000.0f) != secondsLeft)
         {  
             secondsLeft = Math.round((float)ms / 1000.0f);
             TV.setText("seconds remaining: " +secondsLeft );
         }
         Log.i("test","ms="+ms+" till finished="+secondsLeft );
     }

     public void onFinish() {
         TV.setText("0");
     }
}.start();

4
好的回答,但我认为API应该暗示类别不精确。 - s.krueger
1
将近三年过去了,倒计时器仍然会显示最后一次的滴答声两次!但是这个解决方案对我有效,谢谢!+1 - yiwei
在尝试了许多解决方案后,最终这个解决方案对我起作用了。谢谢 +1 - silwar
1
你也可以使用 TimeUnit.MILLISECONDS.toSeconds(ms) - Heitor Colangelo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接