2013-03-25 53 views
0

我發現AsyncTask和TimerTask在不同的API版本中行爲不同。跨API的TimerTask和AsyncTask實現

這是我的設置: TimerTask設置爲每隔一段時間觸發一次。有一個服務的方法在TimerTask觸發時被調用。該方法爲一些後臺處理實例化AsyncTask。請注意,AsyncTask不會觸及用戶界面。

上述所有適用於Android API 16和17罰款,但與標準的失敗,較低級別的API「無法創建處理程序... Looper.prepare()」的錯誤,如這裏解釋Start AsyncTask in TimerTask

我通過將AsyncTask更改爲Runnable來解決此問題,然後手動在服務的方法中啓動新線程。但是,我不知道自16版以來API已經發生了什麼變化? Looper.prepare()現在實際上是否在TimerTask線程中調用?如果是這樣,是否有一種簡單的方法可以在我的代碼中實現同樣的事情,以便我可以繼續使用TimerTask(Runnable解決方案在很多方面都不是最優的,因爲我可能決定稍後從AsyncTask更新UI)。

感謝,

Veljko

+0

http://developer.android.com/reference/android/os/AsyncTask.html – Raghunandan 2013-03-25 12:08:39

回答

0

問題可能是您沒有在UI線程中創建第一個AsyncTask,這將影響隨後創建的所有AsyncTasks。看看這個問題 - onPostExecute not being called in AsyncTask (Handler runtime exception)

解決的辦法是從Application類加載AsyncTask。

較低級別的API上的AsyncTask行爲也不同。異步任務真正在較低的API中同時運行,而不是在較高級別的API中一次運行一個任務。這可能是一個促成因素。

只有在需要進行UI更新時才需要Async任務。這就是班級的前/後操作。如果沒有UI更新,使用Runnable完全可以。只要確保Runnables在處理完成後不會停留。

您可以使用類似於@ Atrix1987的警報,但是我只在調度時間超過15分鐘時才使用它們(這可能對您仍然適用)。我在另一個問題 - Scheduling recurring task in Android中解釋了原因。

+0

謝謝Deepak,我遵循了這些建議並添加了'Class.forName(「android.os.AsyncTask」);'在Application類中。現在它在每個API版本中表現相同。我也同意關於AlarmManager的評論。 – 2013-03-25 13:57:08