2012-06-24 45 views
0

我需要间隔执行代码,有时10秒,有时5分钟。该代码应在从开始确切 10秒钟,然后执行在确切 5分钟,从开始10秒,等等
记时计从开始沿越来越少,所以执行时间必须是准确的。在特定时间执行代码:Handler? AlarmManager?

使用Handler.postDelayed不起作用,因为要执行的代码可能需要一些时间。在发生这种情况时,代码的下一次执行可能会很晚。

当我想实现AlarmManager,只见音符

报警管理器是用于在您希望您的 应用程序代码运行在特定的时间,即使你的应用程序是 不是个案正在运行。对于正常的定时操作(滴答,超时, 等),使用Handler更容易,效率更高。

所以我有点困惑,我该怎么做才能保证正确执行?

回答

1

正如克里斯所说,在Android中没有确切的时机。

但是,你可以尝试这样的实时接近...

一些伪等待5秒:

class mJob implements Runnable{ 
    public void run(){ 
     while(System.currentTimeMillis()<myExactTime){ //poll for your time 
     Thread.sleep(1); 
     } 
     //Ok, we are as near as we'll ever get 
     //call here your 'realtime' function or whatever you need 
    } 
} 

mHandler.postDelayed(mJob,4950); //the closer to 5000, the better for the cpu but you could miss your `myExactTime` 

我现在不如何准确,这是,你就得去尝试。但我发现没有其他方法可以通过普通SDK实现更多“实时”。你甚至可以删除sleep(1)以更接近你的myExactTime

下一次呼叫使用这样的事情(从零开始):

nextCallDelayInMillis = starttimeInMillis+No1_Delay+No2_Delay-System.currentTimeMillis();

1

看看这篇文章:Time/Date change listener。您可以使用setRepeating()方法,或者在每次执行后再次设置计时器。

0

我建议你使用postDelay,任何发布到处理程序,处理程序正在打开新的线程和代码正在同时执行。

private Runnable mUpdateTimeTask = new Runnable() { 
public void run() { 

//some code 

mHandler.postDelayed(this, 1000); 
} 
}; 

这里是我完整的代码我用postDelay显示倒计时:https://github.com/minimaldevelop/antistress/blob/master/src/com/minimaldevelop/antistress/AntiStressExerciseActivity.java

而且,这里我使用AlarmManger但只是作为剩余在通知栏时,应用程序关闭时显示的消息。

1

由于android不是一个硬实时的操作系统,所以确切的没有实质性的内核修改是不可能的。即使在那里,你也不可能在典型的Android设备上使用有限I/O的准确定时方式,所以仅仅在完美的时间运行你的代码可能是不够的。

充其量你可以确定使用更可靠的定时器你的代码可以运行的最新点,并采取事后补偿措施。

就可用的定时方法而言,如果您打算将设备从睡眠中唤醒以完成事件,则应该考虑一个主要问题,在这种情况下,如果您打算让设备保持唤醒状态,则应使用闹钟管理器哪种情况下你应该使用唤醒锁,或者只有在设备唤醒并且服务或活动正在运行时才能发生事件,在这种情况下,你可以使用简单的定时器。

1

如果你的代码,同时应用程序运行运行或后台服务没有指定。这很重要,因为在您锁定设备之后,Android会进入睡眠模式,在此模式下,CPU关闭并且不会激活postDelayed之类的功能。 Intents也要求开始活动。 但AlarmManager广播将。 我会从here

的AlarmManager最适用于需要 运行即使程序没有打开任务使用的引用。对于在应用程序使用期间需要运行的正常计时操作 (滴答声,超时等),使用 处理程序的postDelayed()和postAtTime()方法会更有效率 。 AlarmManager需要太多的开销来证明 被这样使用。