我有一個服務,它做了一些工作,完成後,它發送廣播。在活動中,接收器被註冊並在onReceive中接收廣播。現在我需要從數據庫中選擇數據並在列表視圖中顯示它們。但我不想在UI線程上做數據庫選擇,因爲這可能是昂貴的操作,我想打開異步任務,但這又是接收器的生命週期。我還有什麼其他解決方案?打開服務?是的,我可以在新服務中執行數據庫操作,但是如何將數據交付給服務中的視圖?從服務更新視圖肯定是我不想做的事情。我現在處於一種死亡狀態。數據庫裏面onReceive
感謝您的任何想法
編輯1:這是從Android文檔的解釋,爲什麼你不能的onReceive使用的AsyncTask,爲什麼答案是無效
接收器生命週期 一個BroadcastReceiver對象纔有效在onReceive(Context,Intent)的調用期間。一旦你的代碼從這個 函數返回,系統就認爲該對象已經完成,不再是 活動。 這對您在onReceive(Context,Intent)實現中可以執行的操作有什麼重要影響:任何需要異步操作的異步操作都不可用,因爲您需要從函數返回 來處理異步操作,但是在 指出BroadcastReceiver不再處於活動狀態,因此在異步操作 完成之前,系統可以自由地終止其進程。 特別是,您不能在BroadcastReceiver中顯示對話框或綁定到服務。對於前者,您應該使用NotificationManager API代替 。對於後者,您可以使用 Context.startService()向服務發送命令。
編輯2:答案使我一個解決方案,在活動創建一個處理程序,並把它傳遞給接收器,在其的onReceive剛剛發佈消息處理程序,然後將處理程序內打開異步任務做數據庫的東西。不知道如果這是一個好的。
我不明白asynctask的問題? – njzk2
onReceive只有在你返回時纔會生存,然後系統可以自由地終止它的進程,所以如果我從onReceive中打開異步任務,我無法確定系統在完成之前不會殺死它。 –
你可以在你的服務 – njzk2