2012-04-03 45 views
0

在什麼特定情況下會發生這樣的超時?我安排一個警報來定期啓動一個服務,所以我創建了一個PendingIntent來定位服務(通過調用PendingIntent.getService(......)),並將它傳遞給AlarmManager setRepeating(..... ) 方法。報警類型是RTC_WAKEUP。服務正在死亡,在日誌中看到「ActivityManager:超時執行服務......」。原因?

正如目前實現的那樣,服務不會產生一個單獨的線程來完成它的工作,在onStart()中完成所有工作。

該服務執行一些數據庫查詢,並且我懷疑我現在經常在日誌中看到「超時執行服務...」消息的原因,因爲我的服務死掉了,這些查詢需要更長時間DB增大。

但是,特別是會導致執行超時。

  • 是不是在做main線程的工作?

所以,從產卵在onStart一個單獨的線程(),允許在onStart()來及時返回,而DB查詢等方式對單獨的線程運行將完全消除此問題?還是有什麼我失蹤?

回答

2

如果你使用android.app.Service作爲基類,你正在做主線程上的工作。開發者請不要在主線程上做DB操作!你會放慢系統,很可能會導致你的應用程序的ANR。

使用IntentService而不是Service來確保工作發生在單獨的線程上。 IntentService專門用於在單獨的線程上執行異步後臺處理。

您可以在IntentService本身中設置AlarmManager,然後讓它自動重複,無需您的應用程序的干預。向IntentService發送一個「開始」意圖,以便第一次啓動該服務並設置重複計劃。給PendingIntent一個「循環」意圖,然後使用AlarmManager.setRepeating設置您的日程安排。定期的,AlarmManager實例會將「循環」意圖發送給您的IntentService,並且您可以在其中執行數據庫工作。

要停止警報,請有一個「停止」意圖,您可以發送將取消警報。

+0

我使用AsyncTask來執行數據庫操作... – 2013-07-25 10:22:09