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

Mo2*_*Mo2 5 android timer textview

我想CountDownTimer在a中显示一个简单的TextView,但它似乎从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();
Run Code Online (Sandbox Code Playgroud)

All*_*n G 6

有两个问题:

  • 第一个问题是倒数计时器直到第一次打勾的时间已经过去,在这种情况下,在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);
Run Code Online (Sandbox Code Playgroud)


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


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