[英]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.