在Android中,在UI-Thread中不執行數據庫操作(或者至少是複雜的操作)通常是一種好的做法。我有一個複雜形式的活動,我希望確保所有數據都在活動進入後臺時保存(例如,用戶按下主頁按鈕或打電話進來)。在activity的onPause()方法中,我可以啓動一個將數據存儲在數據庫中的AsyncTask,但我永遠無法確定該任務是否成功完成,因爲在任務完成之前,android可以終止進程,因爲活動和整個應用程序都處於後臺。如何確保android在殺死進程之前保存數據
我可以在onPause方法中保存數據同步,但可以運行到ANR。
我知道在活動被殺後,Android會恢復視圖,但只有在視圖ID是唯一的情況下,此功能纔有效。我有很多以編程方式添加的視圖,我無法確保Id的唯一性,並且使用saveInstanceState功能幾乎是不可能的,因爲我必須保存非常複雜的模型。
有沒有可能確保數據在android之前殺死一個進程而不在UI線程中執行?
根據Android API文檔不太可能,但也有可能服務將被殺死。好吧,我可以嘗試重新啓動服務,但爲了確保數據將被保存,我可以運行到一個無限循環(我承認這是非常不可能的,但不是不可能的)。目前唯一的方法來存儲數據,並確保它保存在任何情況下是在UI線程是一個非常糟糕的應用程序設計 – dan 2013-05-08 11:08:12
我完全同意你觀察有關Android決定殺死最糟糕的情況即使它正在託管服務也是如此。這是可能的,但在同一時間(如你所說)極不可能。在UI線程上存儲數據實際上並不能確保被保存,因爲在幾秒鐘之後,用戶可能會看到一條ANR消息。當他決定殺死你的應用程序時,它會立即下降,甚至沒有完成你的保存操作。 – baske 2013-05-08 11:20:53
順便說一下,這些故事呢:用戶決定關閉手機,而您的服務正在存儲數據。你會採取喚醒鎖來防止這種情況發生嗎?即使所有這些東西都在原地:如果電池完全死亡,你會做什麼?我給出了這些觀察結果,說明一點:你想成爲多少人?您應該始終分析完成「足夠」和「太多」以防止數據丟失之間的權衡。您處理的數據有多關鍵?國際海事組織委派一個AsyncTask仍然很危險,但委託給一個服務是相當安全的。 – baske 2013-05-08 11:26:06