在我们开发Android中有多种数据存储方案,例如常见的文件存储,Sqlite,网络也算是一种存储方案,但是Android系统为我们提供了一种更加方便的一种数据存储方式。那就是今天要讲的是SharePreference数据存储。其本质也就是文件存储,不过是符合标准的xml文件存储而已。
1 SharePreferences基本使用



可以发现SharedPreferences实际上是把信息存储到本地磁盘的/data/data/<packagename>/shared_prefs目录下,实际上就一个xml文件。
2 SharePreferences源码分析
SharedPreferences接口

Editor接口


3 SharedPreferencesImpl实现类分析
我们从上面SharePreference的使用入口可以分析,获取实例的方式有多种,但最终调用的都是ContextImpl的getSharedPreferences方法。


下面我们来看下sp文件的存储路径和文件创建,


下面继续分析SharedPreferencesImpl类构造函数



下面我们来看下我代码中的
mSharedPreferences.getString("name",""); 第216行就是存在返回找到的值,不存在就返回设置的defValue。


4 SharePreferences内部类Editor实现EditorImpl分析


到这里可以发现Editor的put各种方法仅仅是将相关数据暂时存到内存中mModified中,接下来我们需要调用commit或者apply方法才能生效。

首先分析第一步:

MemoryCommitResult mcr =new MemoryCommitResult(); 首先实例化一个对象了,最后调用方法返回也是这一个对象,其实这个方法主要是构造MemoryCommitResult 数据结构,然后改变mcr 的一些属性值最后返回重新更新过mMap值封装的数据结构。作用提交到内存
第二步:
核心就是调用enqueueDiskWrite方法

第二步写入磁盘其实就是做一些数据库的事务操作(原子性的)还有备份文件。

第三步:阻塞等待写操作完成
第四步:通知数据发生变化,回调设置的监听方法。
第五步:就是返回commit写文件是否成功。
上述就是commit方法,下面继续将apply方法分析完:

总结:SharedPreferences在实例化时会首先异步磁盘读取文件,然后缓存到内存中,接下来的读操作都是在内存中操作而不是文件操作了
调用commit方法提交数据时,其过程是先把数据更新到内存,然后在当前线程中写文件操作,提交完成返回提交状态;如果是apply方法提交数据,然后写到内存,接着在线程池中异步写文件,没有返回值的。
可以发现我们在commit时候中间有多级锁操作,如果当我们有多次修改写操作时可以等批量put之后完了再一次调用提交commit,这样可以提高效率。
网友评论