【发布时间】:2015-10-29 18:17:49
【问题描述】:
我正在使用 SharedPreferences 在我的应用程序中保留用户数据。
我知道commit() 和apply() 方法之间的区别,但我注意到commit() 返回true 如果新值成功写入持久存储 而apply() 没有。
可能导致commit() 方法返回false 或apply() 方法失败的原因是什么?
【问题讨论】:
我正在使用 SharedPreferences 在我的应用程序中保留用户数据。
我知道commit() 和apply() 方法之间的区别,但我注意到commit() 返回true 如果新值成功写入持久存储 而apply() 没有。
可能导致commit() 方法返回false 或apply() 方法失败的原因是什么?
【问题讨论】:
我们来看看the source code for commit():
public boolean commit() {
MemoryCommitResult mcr = commitToMemory();
SharedPreferencesImpl.this.enqueueDiskWrite(
mcr, null /* sync write on this thread okay */);
try {
mcr.writtenToDiskLatch.await();
} catch (InterruptedException e) {
return false;
}
notifyListeners(mcr);
return mcr.writeToDiskResult;
}
换句话说,如果线程在等待磁盘写入完成时被中断,或者磁盘写入由于某种原因失败(很可能是因为磁盘已满),commit() 将返回 false。
【讨论】: