我们经常使用的SharedPreferences其实是存在很多缺陷的,主要表现在
- 占用内存
- getValue时可能导致ANR
- 不支持多进程
- 不支持局部更新
- commit或apply都可能导致ANR
以下参考安卓源码的基础上,使用大白话和部分代码片段和大家一起探讨分享。
占用内存
final class SharedPreferencesImpl implements SharedPreferences {
......
//构造方法
SharedPreferencesImpl(File file, int mode) {
mFile = file;
mBackupFile = makeBackupFile(file);
mMode = mode;
mLoaded = false;
mMap = null;
mThrowable = null;
//从磁盘里获取xml里的数据
startLoadFromDisk();
}
.....
}
我们都知道Context的上下文实现是依靠ContextImpl这个类,而我们的SharedPreferences的实现是依靠SharedPreferencesImpl类,
ContextImpl.java
/**
* Map from package name, to preference name, to cached preferences.
*/
private static ArrayMap<String, ArrayMap<File, SharedPreferencesImpl>> sSharedPrefsCache;
在我们的ContextImpl类中存在一个静态的ArrayMap对象用于缓存当前packageName下的所有sp文件对象,
但是在这个类里面我们可以看到缓存数组的探空 初始化和赋值&#