2011-07-18 41 views
2

我想在特定時間開始任務。對於我使用runnablepostDelayed方法如下:使用postDelayed在特定時間運行任務

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

      try { 
       MY TASK 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
}; 

在我的代碼我使用mLunchTask如下:

mHandler = new Handler(); 
mHandler.postDelayed(mLaunchTask, myDelay*1000); 

myDelay計算如下:

s = DateFormat.format("hh:mm:ss aaa", d.getTime()); 
cTime = s.toString(); // current Time 
ch = Integer.parseInt(cTime.substring(0,2)); // current hour 
cm = Integer.parseInt(cTime.substring(3,5)); // current minute 
cs = Integer.parseInt(cTime.substring(6,8)); // current second 
if (cTime.substring(9,11).equalsIgnoreCase("pm") && (ch<12)) ch = ch+12; 
myDelay=(desiredHour-ch)*3600+(desiredMinute-cm)*60 - cs; 
if (myDelay<0) myDelay = 0; 

desiredHourdesiredMinute由用戶設置。預期MY TASK開始於desiredHourdesiredMinute和0秒。 但是「我的任務開始用幾秒鐘的延遲,這看起來是隨機的。

基於上面的代碼中,沒有任何理由,它並沒有確切的所需時間開始?

感謝

+0

啊,mLunchTask:我的最愛:) –

回答

4

首先,你的延遲計算是正確的,但「點」檢測不與其他語言的工作,這是更好的使用日曆來獲得延遲。

Calendar calendar = Calendar.getInstance(); 
long currentTimestamp = calendar.getTimeInMillis(); 
calendar.set(Calendar.HOUR_OF_DAY, desiredHour); 
calendar.set(Calendar.MINUTE, desiredMinute); 
calendar.set(Calendar.SECOND, 0); 
long diffTimestamp = calendar.getTimeInMillis() - currentTimestamp; 
long myDelay = (diffTimestamp < 0 ? 0 : diffTimestamp); 

現在你有延遲毫秒,可以啓動處理程序:

new Handler().postDelayed(mLaunchTask, myDelay); 

在我測試的下列可運行日誌在所需的時間沒有任何延遲。

private Runnable mLaunchTask = new Runnable() { 
    public void run() { 
     Calendar calendar = Calendar.getInstance(); 
     Log.d("test", "started at " 
      + calendar.get(Calendar.HOUR_OF_DAY) + " " 
      + calendar.get(Calendar.MINUTE) + " " 
      + calendar.get(Calendar.SECOND) 
     ); 
    } 
}; 

也許您的啓動任務需要幾秒鐘才能加載?

AlarmManager可以替代嗎?

+0

感謝您的回答。我的任務並不是一項繁重的任務,應該馬上開始。然而,你的建議是研究AlarmManager,這是一個很好的建議,我應該可以使用它。 – TJ1

0

根據我的經驗和閱讀文檔,postDelayed基於正常運行時間,而不是實時。如果手機進入深度睡眠狀態,它可能會導致實時性無法正常運行。這意味着你的任務將比預期晚。

處理程序確實看起來是專門用於在活動活動中更新GUI,而不是調度將來的任務。正如經銷商所說,AlarmManager可能是您最好的選擇。

0

Naliba的答案並不完全正確。

基於可以看到的文檔here 可以看出,該類專門用於將來運行任務。

「有一個處理程序兩種主要用途:(1)調度消息和可運行爲在未來一些點被執行;和(2)入隊的動作要在不同的線程進行「

當系統進入睡眠模式時,沒有提及應用程序的行爲,應在發佈其他信息之前測試此問題。

+0

我的回答是正確的;當我們寫我們的帖子的時候,谷歌文檔非常糟糕。他們通過鏈接到uptimeMillis的定義來改進它。 – Naliba

相關問題