繁体   English   中英

在TextView上显示时,CountDownTimer跳过一秒钟

[英]CountDownTimer skipping one second when displaying on TextView

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

这是在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();

有两个问题:

  • 第一个问题是倒数计时器直到第一次打勾的时间已经过去,在这种情况下,在1000ms之后。

  • 第二个是经过的时间只是近似值。 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)));
}


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

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

你可以在这个帖子上找到解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM