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已經爲我們封裝。