2011-11-05 50 views
7

我對static class variables有不好的經驗,因爲班級卸載時會丟失它們的值。因此我全部避免它們。我是否需要恢復所有變量onResume?

現在我(可能過分),即使「正常」的變量擔心。

我不知道,如果他們的價值也可能會丟失在某些情況下, 像通過電話,低內存或其他任何中斷。

我可以依靠變量保持其值100%嗎?

我保證某種有效的恢復對所有活動的變量?

謝謝!

回答

19

我對靜態類變量有不好的經驗,因爲當類卸載時它們的值會丟失。

類沒有 「卸載」。 Your process will be terminated有時在前臺沒有任何東西時,Android需要回收內存。

我可以依靠的變量保持它們的值100%?或者我確保對所有活動變量進行某種有效恢復?

通過致電onPause()將活動通知他們何時離開前臺。從該活動的角度看,在onPause()之後的任何時間,直到(可能)相應的onResume(),該過程可能會終止並且活動會丟失。

你需要坐下來,想想你的數據模型。假設用戶離開您的應用程序(例如,按下HOME),並且不會返回您的應用程序一小時,一天或一個月。用戶合理期望在該段時間內堅持的任何數據都需要保存在永久性數據存儲庫中,例如數據庫或平面文件。確定何時保存數據是您的工作 - 可能是用戶按下保存按鈕時,或者它可能位於某個活動的onPause()中,或者也許是在某個其他時間。

通過onSaveInstanceState()可以保存與當前屏幕內容相關的數據,但不需要保存一個月的缺勤數據。希望你已經在使用它來處理屏幕旋轉。如果是這樣,並且用戶離開了你的活動,但他們可以通過BACK按鈕導航回它(例如,一個電話進來,然後一個文本消息進來,然後他們點擊一個鏈接在一個短信和調出Web瀏覽器,然後一直返回到您的應用程序,此時已終止),保存的實例狀態將被恢復。

一切 - 活動,或靜態數據成員,或任何的實例數據成員 - 如果用戶離開應用程序,Android是否選擇以終止過程可能會迷路。因此,靜態數據成員通常只用於短期高速緩存,或者用於在用戶按HOME或接打電話或其他任何時如果它們丟失並不重要的事情。

+0

我的應用程序崩潰與NullPointerExpection同時比較兩個靜態類變量:斧== Bx的因爲我100%肯定的值不能從App本身設置爲null,我問這個問題,並得到迴應,解釋這與「卸載「導致靜態變量變爲空。所以我實現了類A作爲一個持有全局常量的單例。現在我將B類的所有值保存到數據庫中。問題是,我應該在onResume中從​​數據庫還原所有關鍵值嗎?我在哪裏可以閱讀關於你解釋的細節 - 因爲我不確定我是否完全理解了所有的事情。謝謝! – user387184

+0

ps有沒有辦法測試這些「特殊」情況?如果在將關鍵變量保存到數據庫之前,我的應用程序中斷髮生了什麼事情會發生什麼?或者將onPause始終被調用,所以我可以確保將值保存在onPause中?否則,誰知道,如果一個部分被保存而另一部分不是由於該中斷導致數據庫可能很容易被破壞?再次感謝! – user387184

+0

@ user387184:「問題是,我應該在onResume中從​​數據庫還原所有關鍵值嗎?」 - 我該怎麼知道?這是你的應用程序,不是我的。 「我可以在哪裏閱讀你所解釋的細節 - 因爲我不確定我是否完全理解了一切。」 - 我在答案中鏈接到流程生命週期文檔。以下是活動生命週期文檔:http://developer.android.com/guide/topics/fundamentals/activities.html#Lifecycle。 「或者將onPause始終調用,以便確保將值保存在onPause中?」 - 'onPause()'將被稱爲禁止用戶的電池彈出。 – CommonsWare

0

正常變量依然存在,但問題在於,當你在onResuming時和你正在創建時,你永遠無法確定(因爲你無法控制Android剛剛走到哪裏並將堆棧中的東西扔出窗口。 ..目前沒有被使用的東西有資格銷燬)。

所以......你最好的選擇是以任何有意義的方式保存東西,如果你真的需要他們在某些地方有人可能會邏輯地讓設備進入睡眠,旋轉,或打電話或其他任何地方這會中斷它的TOP(ness)。

我真的不喜歡捆綁包的工作方式,所以我一直在將我的東西存儲在一個JSON對象中,我將其轉換爲字符串並保存爲一個平面的SharedPreference字符串(請注意,SP永遠存在,而一旦你的應用程序被GCed,你的Bundle將與其他所有東西一起被扔掉)。這樣我就可以隨時隨地抓住它,而不必與十億個不同的Bundle元素打成一片,但這顯然是一種品味問題。還有更多的工作的前期,並在序列化/反序列化當然咯更多的開銷,但因爲它是隻在極少數情況下,我的變量被破壞發生,這真的沒有什麼可擔心的(除非你有大量的的數據,在這種情況下,您應該使用數據庫,無論如何)。

相關問題