我正在處理我的第一個Android應用程序。它有一個隨着用戶更新而持久保存到數據庫的模型。onSaveInstanceState/onPause - 等到狀態完全保存後才允許進程被終止
當調用onSaveInsanceState
時,我想保存一個可用於從數據庫加載用戶正在處理的文檔的標識。但是這隻能在文檔完全打開數據庫時纔會發生。在某些情況下,持續複雜的文檔可能需要幾秒鐘的時間(我希望一旦我完成所有的詳細註銷,速度會加快,並且在實際使用中,複雜的文檔將由用戶分階段構建,其中每一個將被保存到數據庫中,因此複雜文檔不一定要全部保存)。
現在,線程在Android上的#1規則是「不要屏蔽UI線程」,所以當然數據庫交互發生在一個單獨的線程上。但是我對Android生命週期的理解是,在很多情況下onSaveInstanceState被調用,因爲Android系統想要終止進程。這表明我不能讓這個方法返回,直到數據庫線程完成保存文檔爲止(事實上,使用我目前的設計,實際上我並不知道文檔的ID號是什麼,直到它被保存到數據庫中,所以我甚至不能把它放在保存好的狀態中)。
在這些情況下阻止UI線程等待持久任務是否合適?當調用onSaveInstanceState
是因爲進程被終止時,該應用程序在前臺不再可見,所以沒有界面變得無法響應。
但是,當Activity實例被配置更新拋棄時,也會調用onSaveInstanceState
,這會在屏幕方向更改時發生。這是非常不幸的,當側向旋轉屏幕無法做任何事情幾秒鐘。在這種情況下,進程(因此內存空間)仍然存在,所以如果我可以只在Bundle中存儲引用而不是其ID,那麼我並不嚴格需要確保文檔到達數據庫。但我不知道有什麼方法可以說明這兩種情況之間的區別。
對於這些情況是否有一個公認的做法?我應該阻止線程安全嗎?我可以使用普通的Java線程原語來阻止和等待嗎?有什麼我可以做的不阻止線程,但確保堅持任務將完成之前Android關閉的過程?
所有這些也適用於,因爲onSaveInstanceState
不一定會被調用。
我認爲'AsyncTask'的重點是它*不會阻塞UI線程?難道不是使用它來做長期作業的重點嗎? – Ben
如果您在配置更改時遇到問題,請不要擔心,只需在此活動標記中的mainfest文件中記下configChanges,以便在方向更改時從不調用onSaveInstanceState()。它不會強制重新啓動 –
這很方便(但有其自身的問題),但與問題完全無關,這是如何確保在應用程序被終止時實際保存的持久數據(如果保存是由背景完成的)線。 – Ben