Android`CountDownTimer`坏了吗?

时间:2014-03-25 01:57:41

标签: android

我使用看起来非常有前途的CountDownTimerhttp://developer.android.com/reference/android/os/CountDownTimer.html

使用60秒计时器倒计时

但有时我发现在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的问题?我的意思是,我查看了源代码,定时器应该在处理程序中同步...消息是否按顺序发布?

1 个答案:

答案 0 :(得分:0)

蜱在保证的时间间隔内没有...这就是为什么它将long传递给您的onTick ..

来自文档

  

对onTick(long)的调用将同步到此对象   呼叫onTick(长)在上一次回调之前不会发生   完成。这只是执行时的相关内容   onTick(long)需要一段时间才能执行,这很重要   与倒计时间隔相比。

因此,这意味着如果您在onTick中执行的工作所需的时间超过"常规时间间隔"那个间隔会变得越来越不规则。添加调试器的开销时肯定会出现这种情况。

如果你必须在onTick上工作,我会在一个不在计时器线程上的线程中进行。但即便如此,我也不认为你可以或者应该依赖获得一定数量的滴答声。当操作系统无法确保实时语义时,它似乎存在风险且容易出错。