數(shù)據(jù)持久化--SharedPreference
大致說明
??SP常用于對(duì)基本配置信息的保存,一處修改,多處讀取配置,一般在項(xiàng)目中會(huì)用于對(duì)用戶名的保存、APP是否初次進(jìn)入等配置,適合存儲(chǔ)簡單、輕量級(jí)的數(shù)據(jù)存儲(chǔ)。
使用步驟大致為 獲取SP對(duì)象、通過SP獲取編輯器 editor,通過editor進(jìn)行添加、修改、移除K-V,清空或者其他操作,但進(jìn)行操作之后務(wù)必要進(jìn)行提交操作,否則操作將無法生效。
開發(fā)過程中,一般會(huì)將這些操作進(jìn)行封裝,省去重復(fù)編寫這些固定的操作,避免遺漏導(dǎo)致發(fā)生問題。
詳細(xì)描述
-
1. 使用場景
- 一般使用SharedPreference來存儲(chǔ)應(yīng)用程序的配置信息
- 一般存儲(chǔ)在應(yīng)用程序的私有存儲(chǔ)區(qū),文件權(quán)限是私有的,只能供寫入者讀取
使用鍵/值(NVP機(jī)制)來存儲(chǔ)數(shù)據(jù)。支持的數(shù)據(jù)類型(boolean、int、float、long和String) - 存儲(chǔ)在應(yīng)用程序的私有目錄下(data/data/包名 /shared_prefs/)自定義的XML文件中
-
2. 使用步驟
-
創(chuàng)建SP對(duì)象 :Context.getSharedPreference(String name,int mode)
- name: 要操作的文件名
-
mode: 操作權(quán)限
- Context.MODE_PRIVATE: 指定該SharedPreferences數(shù)據(jù)只能被本應(yīng)用程序讀、寫。
-
Context.MODE_WORLD_READABLE: 指定該SharedPreferences數(shù)據(jù)能被其他應(yīng)用程序讀,但不能寫。 7.0中會(huì)拋安全異常 -
Context.MODE_WORLD_WRITEABLE: 指定該SharedPreferences數(shù)據(jù)能被其他應(yīng)用程序讀,寫。 7.0中會(huì)拋安全異常
- 其他創(chuàng)建方式:
-
PreferenceManager.getDefaultSharedPreferences(Context context)
返回以包名為文件名的sp對(duì)象public static SharedPreferences getDefaultSharedPreferences(Context context) { return context.getSharedPreferences(getDefaultSharedPreferencesName(context),getDefaultSharedPreferencesMode()); } private static String getDefaultSharedPreferencesName(Context context) { return context.getPackageName() + "_preferences"; } private static int getDefaultSharedPreferencesMode() { return Context.MODE_PRIVATE; }?? -
getPreferences(int mode)
activity 專有public SharedPreferences getPreferences(int mode) { return getSharedPreferences(getLocalClassName(), mode); }?
-
PreferenceManager.getDefaultSharedPreferences(Context context)
-
使用
-
通過SharedPreferences.Editor 進(jìn)行一系列操作
- putXxx(String key , xxx value): 向SharedPreferences存入指定key對(duì)應(yīng)的數(shù)據(jù)
- clear():清空SharedPreferences里所有數(shù)據(jù)
- remove(): 刪除SharedPreferences中指定key對(duì)應(yīng)的數(shù)據(jù)項(xiàng)
- boolean commit(): 當(dāng)Editor編輯完成后,使用該方法提交修改 原子過程 主線程提交?
- void apply() :異步提交修改,在一個(gè)單線程的線程池中執(zhí)行寫入
-
通過SharedPreferences.Editor 進(jìn)行一系列操作
-
-
3. 注意事項(xiàng)
-
創(chuàng)建的時(shí)候會(huì)把整個(gè)文件全部加載進(jìn)內(nèi)存
- 第一次從sp中獲取值的時(shí)候,有可能阻塞主線程,使界面卡頓、掉幀----主線程會(huì)等待加載SP的線程加載完畢
- 解析sp的時(shí)候會(huì)產(chǎn)生大量的臨時(shí)對(duì)象,導(dǎo)致頻繁GC,引起界面卡頓?
- 這些key和value會(huì)永遠(yuǎn)存在于內(nèi)存之中,占用大量內(nèi)存? ----getSharedPreference時(shí)會(huì)將所有的SP放到一個(gè)靜態(tài)變量里緩存起來
-
避免存儲(chǔ)Json等特殊符號(hào)很多的value
特殊符號(hào)會(huì)在解析時(shí)進(jìn)行特殊處理引發(fā)額外的字符串拼接以及函數(shù)調(diào)用開銷
- 多次apply會(huì)卡界面
>Activity在Stop時(shí)會(huì)等待寫入線程寫入完畢
- 避免跨進(jìn)程
-
創(chuàng)建的時(shí)候會(huì)把整個(gè)文件全部加載進(jìn)內(nèi)存
總結(jié)
??SP是開發(fā)當(dāng)中常用的一種數(shù)據(jù)持久化方式,一般APP存儲(chǔ)的配置文件基本是全局通用的,因此維護(hù)一個(gè)通用的SP對(duì)象即可,開發(fā)當(dāng)中可以對(duì)SP進(jìn)行封裝成工具類,Context對(duì)象可以選用自定義的Application實(shí)例,應(yīng)用運(yùn)行過程中只有一個(gè)且一直存在Application,因此可以采取它來對(duì)全局通用的數(shù)據(jù)或方法進(jìn)行管理。
項(xiàng)目地址:https://github.com/ticksj/AllAndroid/blob/master/s_base/src/main/java/com/sj/s_base/utils/SPUtils.java