2013-10-09 121 views
5

嗨我們在android應用程序中遇到了一個奇怪的問題。在我們的應用程序中,當我們啓動應用程序(第一個活動)時,我們將所有需要的對象/數據存儲在Common對象中(稱爲對象A)。我們將上下文本身存儲在該對象中。每當我們在應用程序中需要上下文時,我們都會從對象A獲取上下文並使用它。除以下情況外,所有情況都很好。

i)當我們的應用程序在後臺,我們玩了一些高端遊戲。現在我們通過最小化屏幕回到應用程序(最近的應用程序)。突然,該應用程序崩潰。
ii)如果我們通過設置強制停止應用程序,並通過最小化屏幕回到應用程序,則會發生相同的崩潰。
對象變爲空

這兩種情況下,對象A都變爲空(它可能會被GC刪除),所以所有依賴於對象A的操作都會獲取異常。

爲什麼會發生?我們如何阻止GC收集對象A?我們如何處理停止使用武力?請給出任何想法。

+0

您不能強制GC或系統殺死您的進程。在這種情況下,您應該找到一種序列化/反序列化對象的方法。 –

+0

這可能是編寫Android應用程序時應該瞭解的最重要的概念。 http://developer.android.com/training/basics/activity-lifecycle/index.html – Kuffs

+0

Android(實際上,Dalvik)不會GC單個對象,除非您的應用程序正在運行並且沒有對它的引用。我不知道這個神話在哪裏開始。你的**應用程序**可能會被殺死,在這種情況下,它全部從頭開始。如果您需要保存狀態,請使用'onPause()'和/或'onStop()'進行序列化。請注意,'onDestroy()'只有在完成()一個活動時纔有用。順便說一句,如果你存儲的'context'是一個'Activity'上下文,那麼你做的全部都是錯誤的。 – Simon

回答

7

爲什麼發生這種情況?

其他應用程序需要內存才能運行。假設Android會將您的數據無限期地保存在內存中是不合理的。

我們如何防止GC收集對象A?

不要。爲您的問題尋找不同的解決方案。

我們該如何處理力量停止?請給出任何想法。

最後,該決定是你的,但這裏有幾個常用的選項:

  • 當存儲的數據不再存在,把它當作一個新推出的應用程序。將用戶帶到着陸頁並讓他開始一個新遊戲。
  • 堅持數據。根據你存儲的內容,SharedPreferences或SQLite可能是很好的選擇。有關您的存儲選項的摘要,請參見Storage Options

第二個選項顯然不適用於您的上下文,但我可能會爲上下文設計不同的解決方案。

2

你最好使用它的應用程序上下文! 只需在您的Activity中使用getApplicationContext(),然後使用它。 否則只要系統需要內存,您的活動就會泄漏。

您的活動在按主頁時處於後臺, ,然後玩視頻遊戲或消耗內存的應用時,您的活動被系統釋放。在「正常」的Java對活動的包裝對象得到由GC儘快收集其eligable它看到,當它此外

enter image description here

嘗試瞭解活動的生命週期來解決這個,即它不再被任何其他對象引用。如果您的整個應用程序在系統需要內存時被釋放,這是無法阻止的。 嘗試在onResume()中檢查null並重新實例化對象!

我希望這可以幫助你。