美文网首页
Android SharedPreferences源码分析

Android SharedPreferences源码分析

作者: 在岁月中远行 | 来源:发表于2022-08-21 14:22 被阅读0次

在我们开发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,这样可以提高效率。

相关文章

网友评论

      本文标题:Android SharedPreferences源码分析

      本文链接:https://www.haomeiwen.com/subject/kphmgrtx.html