2012-06-24 49 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需要太多的開銷來證明 被這樣使用。