2012-07-19 95 views
35

我正在使用多個SharedPreferences在我的應用程序中存儲數據。 一些喜好被用於許多活動。SharedPreferences應用程序上下文vs活動上下文

我知道SharedPreferences在內部由映射支持,以便在設置更改時快速讀取訪問並寫入SD卡。

我不知道哪種方式是更好,如果一個sharedpreference是由很多活動比較的訪問:

  1. 使用活動上下文中實例化在每一個活動。
  2. 在每個活動中實例化它,但使用應用程序上下文。
  3. 把它放在例如應用程序類並僅在那裏實例化它,類似於單例。

如果我使用1.解決方案是否有每個活動的共享首選對象?當活動被破壞時,sharedpreference的內部地圖會被破壞嗎?

如果我使用2.解決方案將只有一個實例,雖然我在每個活動中調用getSharedPreferences?只要應用程序還活着,內部映射會在內存中嗎?

希望有人知道Android如何在內部處理它。

+0

我會建議選擇三,你可以從你所有的活動中獲得,你只需要做一次閱讀。 – Joel 2012-07-19 18:38:11

回答

55

這是值得檢討的是sources表明,Context實例(無論是一個ActivityApplication實例)共享同一個靜態地圖HashMap<String, SharedPreferencesImpl>

所以每當你通過Context.getSharedPreferences(name, mode)同名要求的SharedPreferences一個實例你會得到相同的情況下,因爲它首先檢查是否在地圖已包含一個密鑰(這是通過名稱)SharedPreferences實例。一旦加載了實例SharedPreferences,它將不會再次加載,而是從地圖中取而代之。

所以實際上你走哪條路並不重要,重要的是使用相同的名字以便從應用程序的不同部分獲得相同的前綴。然而,爲首選項創建一個「訪問點」可能是一個優點。所以它可能是在Application.onCreate()中實例化的prefs的單例包裝器。

+0

+1即使我相信如此..感謝您的批准 – Rasmus 2012-07-19 20:54:30

7

我會更喜歡使用類的偏好,通過應用程序上下文初始化偏好一次。創建getter和setter(get/put)方法來添加,更新和刪除數據。

這樣它會創建實例一次,並且可以更具可讀性,可重用。

+0

當應用程序從HTTP請求中返回時也很好。在這種情況下,上下文(活動)可能不存在,因此context.getSharedPreferences將導致NPE。當使用單身時,這不會發生。 – CoolMind 2017-01-25 16:33:12

11

SharedPreferences由Android作爲單身內部管理。

context.getSharedPreferences(name, mode); 

只要您使用相同的名稱,您總能獲得相同的實例:只要你想使用你可以得到儘可能多的實例。因此沒有併發問題。

相關問題