學習筆記之SharedPreference問題解答

Android SharedPreferences

http://blog.csdn.net/u012619640/article/details/50940074

(1)每次調用getSharedPreferences時都會創建一個SharedPreferences對象嗎?這個對象具體是哪個類對象?

(2)在UI線程中調用getXXX有可能導致ANR嗎?

(3)爲什麼SharedPreferences只適合用來存放少量數據,爲什麼不能把SharedPreferences對應的xml文件當成普通文件一樣存放大量數據?

(4)commit和apply有什麼區別?

(5)SharedPreferences每次寫入時是增量寫入嗎?

解讀:

1、有一個sSharedPrefs,是靜態變量,爲同一個sharedPreferences對象

2、第一次調用時會去創建一個sharedpreferencesImpl對象,會開啓一個子線程,然後把指定的SharedPreferences文件中的鍵值對全部讀取出來,存放在一個Map中。

3、getString()方法就是從Map對象中查詢出來的值,因爲該方法是寫在UI線程中,如果被阻塞太久,比如60s,這時會出現ANR,因此要根據實際情況是否需要寫在SP文件中,SP只能存放少量數據,而且每次都會加載到內存中。

4、在寫操作中,會用到一個Editor對象,是SharedPreferencesImpl的內部類。會有一個mModified對象來存放‘髒數據’。

5、最後再調用apply和commit。先看commit方法,主要有兩步操作,先commitToMemory,再enqueueDiskWrite

Answers

一:單例模式

二:在UI線程中調用getXXX可能會導致ANR。

三:SharedPreferences只能用來存放少量數據,如果一個SharedPreferences對應的xml文件很大的話,在初始化時會把這個文件的所有數據都加載到內存中,這樣就會佔用大量的內存,有時我們只是想讀取某個xml文件中一個key的value,結果它把整個文件都加載進來了,顯然如果必要的話這裏需要進行相關優化處理。

四:commit的寫操作是在調用線程中執行的,而apply內部是用一個單線程的線程池實現的,因此寫操作是在子線程中執行的。
官方文檔推薦:在不關心返回值的情況下,推薦使用apply()。

五:SharedPreferences每次寫入都是整個文件重新寫入,不是增量寫入。

SharedPreferences幾種模式:

Context.MODE_PRIVATE:應用私有,只有相同的UID才能進行讀寫

Context.MODE_MULTI_PROCESS:多進程安全標誌,Android2.3之前該標誌是默認被設置的,Android2.3開始需要自己設置。

MODE_APPEND:首次創建時如果文件存在不會刪除文件。
注意這些模式可以使用位與進行設置,比如MODE_PRIVATE | MODE_APPEND。

加密

在日常開發中,爲了保密,可以給要加密的value值進行encode加密處理。

多進程操作

由於緩存機制,可能會出現髒數據。

解決方案: 使用ContentProvider封裝SharedPreferences的所有操作,ContentProvider的底層使用就是AIDL,只不過ContentProvider已經爲我們封裝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章