问题类型:冗余读写
解决策略:延迟写入
案例分析:android系统中使用SharedPreferences文件来保存数据非常方便,需要保存时候调用commit就ok。但是呢,没调用一次,就对应一次文件的打开和关闭,从而造成因commit()方法的随意调用而导致文件的重复打开和关闭,android的源码
public boolean commit() {
//1.先通过commitToMemory方法提交到内存
MemoryCommitResult mcr = commitToMemory();
//2.写文件操作
SharedPreferencesImpl.this.enqueueDiskWrite(
mcr, null /* sync write on this thread okay */);
try {
//阻塞等待写操作完成,UI操作需要注意!!!所以如果不关心返回值可以考虑用apply替代,具体原因等会分析apply就明白了。
mcr.writtenToDiskLatch.await();
} catch (InterruptedException e) {
return false;
}
//3.通知数据发生变化了
notifyListeners(mcr);
//4.返回写文件是否成功状态
return mcr.writeToDiskResult;
}
多次调用commit时,只保留最后的一个commit方法就ok