我使用看起来非常有前途的CountDownTimer
:http://developer.android.com/reference/android/os/CountDownTimer.html
但有时我发现在onTick
执行之前,那里的电话实际上已经有60次调用onFinish
。因为这个原因,我常常发现计时器卡在1而不是0。当我坚持使用调试器时,这变得更加明显。实际上,当我在调试器中放置一个断点时,onTick
在调用onFinish
之前被调用的次数只有50次。
我错过了什么,或者我是否真的只是假设当且仅当所有假定的onFinish
函数都被调用时,无法保证调用onTick
?
这是我的代码:
public SomeRetryTimer(long future, long countDownInterval) {
super( 60*1000, 1000);
mCurrentCountdown = 60
}
@Override
public void onTick(long l) {
mCurrentCountdown--;
doSomething();
}
@Override
public void onFinish() {
finishStuff(); // at this point, i find that mCurrentCountdown is sometimes not 0
}
我做错了什么,或者这是API的问题?我的意思是,我查看了源代码,定时器应该在处理程序中同步...消息是否按顺序发布?
答案 0 :(得分:0)
蜱在保证的时间间隔内没有...这就是为什么它将long
传递给您的onTick
..
来自文档
对onTick(long)的调用将同步到此对象 呼叫onTick(长)在上一次回调之前不会发生 完成。这只是执行时的相关内容 onTick(long)需要一段时间才能执行,这很重要 与倒计时间隔相比。
因此,这意味着如果您在onTick中执行的工作所需的时间超过"常规时间间隔"那个间隔会变得越来越不规则。添加调试器的开销时肯定会出现这种情况。
如果你必须在onTick上工作,我会在一个不在计时器线程上的线程中进行。但即便如此,我也不认为你可以或者应该依赖获得一定数量的滴答声。当操作系统无法确保实时语义时,它似乎存在风险且容易出错。