【问题标题】:CountDownTimer skipping one second when displaying on TextViewCountDownTimer 在 TextView 上显示时跳过一秒
【发布时间】:2014-06-03 23:18:42
【问题描述】:

我想在TextView 中显示一个简单的CountDownTimer,但它似乎立即从 30 下降到 28,好像中间有一个滞后。我不确定如何修复这个小错误。这是我的代码:

这是在Button的点击监听器中:

new CountDownTimer(30000, 1000) {

    @Override
    public void onTick(long millisUntilFinished) {
        coolDownTimer.setText("Cool Down for: " + String.valueOf(millisUntilFinished / 1000));
    }

    @Override
    public void onFinish() {
        animatedPic.setClickable(true);
        // reregister the proximity sensor
        sm.registerListener(sensorListener, proxSensor, SensorManager.SENSOR_DELAY_NORMAL);
        coolDownTimer.setText("GO!");
    }
}.start();

【问题讨论】:

标签: android timer textview


【解决方案1】:

有两个问题:

  • 第一个问题是倒数计时器在第一个滴答声经过时间后才会执行,在本例中为 1000 毫秒之后。

  • 第二个是经过的时间只是大概的。 millisUntilFinished 不保证以间隔递增(您可以看到,如果您不除以 1000,则第一个刻度略低于 29000)。

要记住的另一件事是,您不能保证会收到滴答电话。也就是说,如果设备没有足够的时间完成一个滴答,它可能会跳过它(通常只在更快的间隔时才会注意到)。

要解决问题 1,您可以简单地运行 onTick 代码(或将其重构为自己的方法)并在启动倒数计时器时运行它。

对于问题 2,您可以简单地对数字进行四舍五入。

例如:

new CountDownTimer(30000, 1000)
   {
        @Override
        public void onTick(long millisUntilFinished)
        {
            performTick(millisUntilFinished);
        }
        @Override
        public void onFinish()
        {
            animatedPic.setClickable(true);
            // reregister the proximity sensor
            sm.registerListener(sensorListener,proxSensor,SensorManager.SENSOR_DELAY_NORMAL);
            coolDownTimer.setText("GO!");
        }
    }.start();

    performTick(30000);


void performTick(long millisUntilFinished) {
    coolDownTimer.setText("Cool Down for: " + String.valueOf(Math.round(millisUntilFinished * 0.001f)));
}


如果您想确保以最小的延迟更新适当的值,您可能需要考虑减少间隔。

【讨论】:

  • 它现在似乎运行得更好,但是它跳过了最后一秒。它从 2 变为 0,但间隔为 2 秒。
  • 是的,这显然是 CountDownTimer 的“功能”。似乎,在执行一个滴答之前,该类计算剩余的时间,如果它小于间隔,它会跳过间隔并等待执行onFinish。有关更多详细信息,您可以参考这篇文章:stackoverflow.com/a/12283400/3704926 建议将间隔更改为 500。
  • 谢谢,将我的间隔从 1000 更改为 500 有效。
【解决方案2】:

它正在跳过,因为CountDownTimer 不是一个精确的计时器。尝试只打印millisUntilFinished 而不分割它,你会看到一些多余的数字,当它到达第一个刻度时它不会正好是 29000。

您可以参考this thread 获取解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-23
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2015-12-19
    • 1970-01-01
    相关资源
    最近更新 更多