2011-10-14 27 views
3

在我的應用程序中,我使用一個靜態變量來保存當前用戶ID。有一個很難重現此用戶標識簡單消失的錯誤。雖然它可能與應用程序加載期間如何設置此變量的錯誤有關(我仍然無法在受控環境中可靠地再現這種情況,所以我不確定發生了什麼),但我已經開始認爲這與如何從靜態變量回收內存有關(我之前沒有考慮過)。Android中的靜態變量和低內存 - 幾個問題

那麼,什麼時候我的靜態變量可以簡單的消失?

  • 就我所知,如果操作系統報告內存不足 - 可以在應用處於前臺時發生靜態內存回收嗎?還是隻有背景?
  • 有沒有任何可能的方式獲得回收靜態內存沒有低內存條件?我想有時變量消失,沒有應用程序甚至去背景,我不知道任何低內存事件發生(AFAIK低內存指的是整個操作系統,而不是應用程序的內存)
  • 什麼是一種好方法來模擬靜態變量被操作系統收回以查看應用程序的行爲並隨後修復錯誤?

任何增加我的理解更清晰的東西將不勝感激。

謝謝。

+0

他們最近有一個Android開發者「環聊」,他們在這裏觸及靜態變量和塊的主題。他們沒有專門回答你的問題,但總的來說,他們圍繞着你應該儘量避免使用靜態變量來傳遞信息的共識跳舞。鏈接到視頻:http://youtu.be/z1Gk5XUVLuE?t=17m –

+0

我也想你的要點回答,但找不到更具體的東西。最後,我試圖重構我的代碼,以避免使用靜態,如果他們不是常量。還有一個Android [FAQ](http://developer.android.com/resources/faq/framework.html#3),建議僅對「非持久對象」使用靜態字段。 –

+0

如何使用getter首先檢查ID是否已設置並進行初始化? –

回答

0

我建議你不要使用靜態變量來保存當前用戶ID,因爲靜態變量不是存儲數據的最佳方式之一(我假設用戶ID是一個數據,它將保留在應用程序的每個會話中,除非用戶註銷)。

最簡單的方法是使用共享首選項。查看Android Data Storage以閱讀在Android中存儲數據的最佳(實踐)方法。

從您的需要,我邀請您繼續與SharedPreferences。沒有更多的問題,你甚至不需要模擬操作系統回收的任何變量。

+0

我已經在使用共享偏好設置並將ID加載到Loader活動的onCreate中。但是,我可以看到Loader在操作系統殺死並恢復應用程序時可能被繞過,因爲它可能只是啓動了堆棧中的最後一個活動。無論哪種方式,我希望得到我的上面的答案。 –

+0

@Kristiono Setyadi:「擴展應用程序」是什麼?這是比「靜態」更安全的方式嗎? – Ashwin

1

這是問題超級超級老,但我正在寫一篇博文,並提到看到這個。我不知道你是否還在研究這個應用程序(可疑),還是你仍然看到這個問題(也值得懷疑)。我的猜測是你在你的應用程序啓動的Activity中設置這些靜態。當然,如果你的應用程序被關閉,然後重新啓動,你將不會通過該活動。

延遲加載靜態或將它們初始化爲自定義應用程序對象通常會處理此問題。

我已經做了大量有關「在低內存中移除靜態」的想法的研究,基本答案是它不會發生。永遠。