接着上篇分析了SharedPreferences源码,这篇来分析sp的不足。
1 没有提供释放和进行移除的操作,会一直占用内存。
在ContextImpl有个静态属性sSharedPrefs


可以发现一共有5处引用到,但是有new对象出来,有put元素的。就是没有进行移除和释放的操作。这样就会一直占用内存。
2 不支持多进程。
当Mode设置为MODE_MULTI_PROCESS时

这个标志其实只是起到当访问这个sp实例的时候,会判断当前磁盘文件相对最后一次内存修改是否被改动过,如果是的话就重新加载磁盘文件再同步到磁盘上。
这种同步的作用不大,因为当多进程同时修改sp的值时,不同进程里的内存数据不会实时同步。
我们说的支持多进程是 当一个进程修改了数据,另一个进程能拿到最新修改的数据。显然不支持。
3 不支持局部更新。

我们拿apply方法分析,commit同理:
1 当修改一个键值对时,提交到内存后
2 它会把整个数据又重新写入到磁盘文件中,虽然我们只修改一个小点。一个键值对。
3 这样就会导致不必要的内存开销,不支持增量数据写入。
下篇写SharedPreferences可能会导致Anr原理和解决方案
和改造SharedPreferences进行跨进程通信
网友评论