今天调试代码发现大量的sp操作耗用了近3秒时间,当然里面交叉了gson操作。所以下面我查看了有关SharedPreference的文章
https://www.jianshu.com/p/63ee8587de3f 这是一篇非常有深度的文章。
引用这篇博客上面的代码
SharedPreferencesImpl(File file, int mode) {
mFile = file;
mBackupFile = makeBackupFile(file);
mMode = mode;
mLoaded = false;
mMap = null;
startLoadFromDisk();//
}
//初始化的时候会开一个线程去读取xml文件。
private void startLoadFromDisk() {
synchronized (this) {
mLoaded = false;
}
new Thread("SharedPreferencesImpl-load") {
public void run() {
loadFromDisk();
}
}.start();
}
@Nullable
public String getString(String key, @Nullable String defValue) {
synchronized (this) {
awaitLoadedLocked();
String v = (String)mMap.get(key);
return v != null ? v : defValue;
}
}
getString中有一个方法是awaitLoadedLocked();是等待是loadFromDisk()完成,所以在第一次获取SharedPreference时会耗一定时间,取决于本地缓存在sp中的数据。
在项目中选择了一个办法,在application中启动一个子线程去初始化sp
本文通过分析SharedPreferences的源码,探讨了其在初始化时的性能瓶颈。特别是在首次加载时,由于需要从磁盘读取XML文件,可能导致应用响应延迟。文中提出了一种通过提前加载来优化性能的方法。
692

被折叠的 条评论
为什么被折叠?



