数据持久化--SharedPreference
大致说明
SP常用于对基本配置信息的保存,一处修改,多处读取配置,一般在项目中会用于对用户名的保存、APP是否初次进入等配置,适合存储简单、轻量级的数据存储。
使用步骤大致为 获取SP对象、通过SP获取编辑器 editor,通过editor进行添加、修改、移除K-V,清空或者其他操作,但进行操作之后务必要进行提交操作,否则操作将无法生效。
开发过程中,一般会将这些操作进行封装,省去重复编写这些固定的操作,避免遗漏导致发生问题。
详细描述
-
1. 使用场景
- 一般使用SharedPreference来存储应用程序的配置信息
- 一般存储在应用程序的私有存储区,文件权限是私有的,只能供写入者读取
使用键/值(NVP机制)来存储数据。支持的数据类型(boolean、int、float、long和String) - 存储在应用程序的私有目录下(data/data/包名 /shared_prefs/)自定义的XML文件中
-
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)
-
使用
-
通过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,因此可以采取它来对全局通用的数据或方法进行管理。
项目地址:https://github.com/ticksj/AllAndroid/blob/master/s_base/src/main/java/com/sj/s_base/utils/SPUtils.java