資料持久化儲存--SharedPreference
資料持久化--SharedPreference
大致說明
SP常用於對基本配置資訊的儲存,一處修改,多處讀取配置,一般在專案中會用於對使用者名稱的儲存、APP是否初次進入等配置,適合儲存簡單、輕量級的資料儲存。
使用步驟大致為 獲取SP物件、通過SP獲取編輯器 editor,通過editor進行新增、修改、移除K-V,清空或者其他操作,但進行操作之後務必要進行提交操作,否則操作將無法生效。
開發過程中,一般會將這些操作進行封裝,省去重複編寫這些固定的操作,避免遺漏導致發生問題。
詳細描述
-
1.使用場景
-
2. 使用步驟
-
建立SP物件:Context.getSharedPreference(String name,int mode)
- name: 要操作的檔名
-
mode:
操作許可權
- Context.MODE_PRIVATE : 指定該SharedPreferences資料只能被本應用程式讀、寫。
-
Context.MODE_WORLD_READABLE: 指定該SharedPreferences資料能被其他應用程式讀,但不能寫。 7.0中會拋安全異常 -
Context.MODE_WORLD_WRITEABLE: 指定該SharedPreferences資料能被其他應用程式讀,寫。 7.0中會拋安全異常
-
其他建立方式:
-
PreferenceManager.getDefaultSharedPreferences(Context context)
返回以包名為檔名的sp物件
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)
返回以包名為檔名的sp物件
-
使用
-
通過SharedPreferences.Editor 進行一系列操作
- putXxx(String key , xxx value): 向SharedPreferences存入指定key對應的資料
- clear():清空SharedPreferences裡所有資料
- remove(): 刪除SharedPreferences中指定key對應的資料項
- boolean commit(): 當Editor編輯完成後,使用該方法提交修改 原子過程 主執行緒提交
- void apply() :非同步提交修改,在一個單執行緒的執行緒池中執行寫入
-
通過SharedPreferences.Editor 進行一系列操作
-
-
3. 注意事項
-
建立的時候會把整個檔案全部載入進記憶體
- 第一次從sp中獲取值的時候,有可能阻塞主執行緒,使介面卡頓、掉幀----主執行緒會等待載入SP的執行緒載入完畢
- 解析sp的時候會產生大量的臨時物件,導致頻繁GC,引起介面卡頓
- 這些key和value會永遠存在於記憶體之中,佔用大量記憶體 ----getSharedPreference時會將所有的SP放到一個靜態變數裡快取起來
-
避免儲存Json等特殊符號很多的value
特殊符號會在解析時進行特殊處理引發額外的字串拼接以及函式呼叫開銷
- 多次apply會卡介面
>Activity在Stop時會等待寫入執行緒寫入完畢
- 避免跨程序
-
建立的時候會把整個檔案全部載入進記憶體
總結
SP是開發當中常用的一種資料持久化方式,一般APP儲存的配置檔案基本是全域性通用的,因此維護一個通用的SP物件即可,開發當中可以對SP進行封裝成工具類,Context物件可以選用自定義的Application例項,應用執行過程中只有一個且一直存在Application,因此可以採取它來對全域性通用的資料或方法進行管理。
專案地址:Android/blob/master/app/src/main/java/com/pfzl/sjandroid/utils/SPUtils.java" target="_blank" rel="nofollow,noindex">https://github.com/ticksj/SJAndroid/blob/master/app/src/main/java/com/pfzl/sjandroid/utils/SPUtils.java
具體使用可參考SJApplication 與SPTestActivity 。