前言
- sp存储数据的本质是sp会在本地存储中根据传入的名字创建一个相应的xml文件。
- SharedPreferences 本质是接口,真正执行存取的是它的实现类SharedPreferencesImpl。
- 整个应用中只存在一个sSharedPrefs对象。sSharedPrefs本质是一个hashMap,key为name,value是SharedPreferencesImpl的对象。
1: SharedPreferences的简单使用
- 存储数据
SharedPreferences sp=getSharedPreferences("data",MODE_PRIVATE);
SharedPreferences.Editor editor=sp.edit(); //获取编辑器
editor.putString("name","Liu"); //存入String型数据
editor.putInt("age",8); //存入Int类型数据
editor.commit();
- 取数据
SharedPreferences sp=getSharedPreferences("data",MODE_PRIVATE);
//第二个参数为缺省值,如果不存在该key,返回缺省值
String data=sp.getString("name","");
2:从源码角度解析使用
2.1:存储数据部分
a 获取创建SharedPreferences 对象
SharedPreferences sp=getSharedPreferences("data",MODE_PRIVATE);
作用:根据名字“data",去sSharedPrefs中获取SharedPreferencesImpl相应的对象:
- 如果存在,说明之前使用名字”data“存储过数据,拿到SharedPreferencesImpl相应的对象并从本地数据中将相应的xml文件数据读取到内存mMaps中;
- 如果不存在,说明没使用”data"存储过数据,直接创建相应的新的SharedPreferencesImpl对象和本地xml文件,并将新的SharedPreferencesImpl对象放入sSharedPrefs中。
备注:这个过程中重点是有个将本地数据读取到内存中的IO操作,比较耗时。
b 创建编辑器
SharedPreferences.Editor editor=sp.edit(); //获取编辑器
作用:让主线程等待并保证"本地数据读取到内存中的IO操作"这一过程执行结束后,再创建EditorImpl(Editor接口的实现类)的对象,EditorImpl对象中使用之前内存中的mMaps复制一份数据到其成员变量mModifiled中。
2573196-a8bc56fb029c3373.png
备注 :需要注意这个过程每次都会创建一个新的EditorImpl对象,建议全局创建一个EditorImpl对象,然后统一管理。
c 编辑数据
editor.putString("name","Liu"); //存入String型数据
editor.putInt("age",8); //存入Int类型数据
作用: 这个过程数据的编辑其实都是对mModifiled数据的修改。
d 提交
editor.commit(); //ui主线程中执行
editor.apply(); //工作线程中执行
作用:对比mModifiled和mMaps中的数据差异,将差异数据写入mMaps中,然后将mModifiled数据清空,并将最新的数据mMaps通过IO操作写入本地数据想用的xm文件中。
备注:也就是每次commit或者apply操作,基本上都是一次IO操作,比较耗内存。
2.2 : 取数据
- a 创建sp对象
SharedPreferences sp=getSharedPreferences("data",MODE_PRIVATE);
作用跟存放数据一个流程,不赘述。
- b 取数据
String data=sp.getString("name","");
1573462821(1).png
作用:也有个等待的过程,保证第一步骤中的IO操作结束后,才继续执行。取数据是直接从内存中的mMaps进行操作的。
这个杂记是我读了佳作Android之不要滥用SharedPreferences,之后自己的思路的一个梳理,建议可以先细致看完Android之不要滥用SharedPreferences之后,再看这个杂记,可以加深理解和记忆。最后非常感觉Android之不要滥用SharedPreferences作者的无私分享!!!