2012-09-03 17 views
1

我有一個服務,它做了一些工作,完成後,它發送廣播。在活動中,接收器被註冊並在onReceive中接收廣播。現在我需要從數據庫中選擇數據並在列表視圖中顯示它們。但我不想在UI線程上做數據庫選擇,因爲這可能是昂貴的操作,我想打開異步任務,但這又是接收器的生命週期。我還有什麼其他解決方案?打開服務?是的,我可以在新服務中執行數據庫操作,但是如何將數據交付給服務中的視圖?從服務更新視圖肯定是我不想做的事情。我現在處於一種死亡狀態。數據庫裏面onReceive

感謝您的任何想法

編輯1:這是從Android文檔的解釋,爲什麼你不能的onReceive使用的AsyncTask,爲什麼答案是無效

接收器生命週期 一個BroadcastReceiver對象纔有效在onReceive(Context,Intent)的調用期間。一旦你的代碼從這個 函數返回,系統就認爲該對象已經完成,不再是 活動。 這對您在onReceive(Context,Intent)實現中可以執行的操作有什麼重要影響:任何需要異步操作的異步操作都不可用,因爲您需要從函數返回 來處理異步操作,但是在 指出BroadcastReceiver不再處於活動狀態,因此在異步操作 完成之前,系統可以自由地終止其進程。 特別是,您不能在BroadcastReceiver中顯示對話框或綁定到服務。對於前者,您應該使用NotificationManager API代替 。對於後者,您可以使用 Context.startService()向服務發送命令。

編輯2:答案使我一個解決方案,在活動創建一個處理程序,並把它傳遞給接收器,在其的onReceive剛剛發佈消息處理程序,然後將處理程序內打開異步任務做數據庫的東西。不知道如果這是一個好的。

+0

我不明白asynctask的問題? – njzk2

+0

onReceive只有在你返回時纔會生存,然後系統可以自由地終止它的進程,所以如果我從onReceive中打開異步任務,我無法確定系統在完成之前不會殺死它。 –

+0

你可以在你的服務 – njzk2

回答

0

我會建議創建一個Interface,它返回數據到Activity,您可以填寫ListView。我剛剛使用AsyncTask創建了一個演示,其中我在AsyncTask中執行數據庫操作,並使用Interface將數據發送到Activity並更新UI。因此,您可以嘗試用Service替換AsyncTask並執行您自己的操作。 Here is a sample demo source for Database Operation in AsyncTask and returning its content to Activity

+1

中使用一個ContentObserver,加上registerContentObserver,一個唯一的Uri和一個notifyChange(Uri,null),問題是不是在異步任務中做數據庫操作,然後更新列表視圖,問題是我無法在onReceive內部打開異步任務 –

相關問題