2014-03-25 41 views
1

我用一个60秒计时器倒计时用什么看起来是一个非常有前途的CountDownTimerhttp://developer.android.com/reference/android/os/CountDownTimer.htmlAndroid`CountDownTimer`坏了?

但有时我发现,来电还没有真正的onFinish执行之前已有60个来电onTick。通常我会发现计时器卡在1而不是0,因为这个原因。当我坚持在调试器中时,这变得更加明显。实际上,当我在调试器中放置一个断点时,在调用onFinish之前,onTick被调用的次数只有50次。

我错过了什么,或者我真的应该假设只有当所有的onTick函数被调用时,才能保证onFinish被调用?

这里是我的代码:

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

正在检查'mCurrentCountdown'的值是否知道发生这种情况的唯一方法?我不认为有什么'doSomething()'可能导致问题?我自己从来没有遇到过这门课的问题。所以我很好奇它是否有问题 – codeMagic

回答

0

蜱是不是有保障的间隔......这就是为什么它通过longonTick ..

从文档

到onTick的调用(长)是同步的这个对象使得一个 调用onTick(长)将不会发生在前一个回调完成之前 。这仅在执行 onTick(长)需要执行的时间量与倒计数间隔相比是显着的 时才有关。

所以这意味着如果您在onTick中执行的工作比间隔将变得越来越不规则的“常规间隔”更长。当您添加调试器的开销时,肯定会出现这种情况。

如果你必须在onTick中工作,我会在不在定时器线程中的线程中完成它。但即使如此,我认为你不能或不应该依靠获得一定数量的蜱。当操作系统无法确保实时语义时,似乎存在风险和错误倾向。