SharedPreferences - apply()与commit()的区别

3
我知道apply和commit之间的区别。在我的情况下,我希望使用commit(),但Android建议我使用apply(),因为它在后台运行且不会阻塞主线程。 如果我使用apply,这样的操作是否有效?或者说,在调用之前,apply未能更新它是可能的吗?
editor.putBoolean("TEST", true)
editor.apply()

if (preferences.getBoolean("TEST")) {
   //do something
}
2个回答

12

根据文档所述,我希望它能够正常工作:

apply()立即将其更改提交到内存中的SharedPreferences,但启动了异步提交到磁盘,并且您将不会收到任何失败通知。

由于您正在访问相同的首选项对象(是单例),因此始终应该看到一致的视图。


1
那么为什么会有一个名为"commit()"的函数呢? - Thomas Klammer
2
提交(commit)在需要知道写入是否成功的情况下非常有用。如果您不使用该信息,请始终使用应用(apply)。 - Tim
1
commit() 函数在原始的 API level 1 中就已经存在了,而 apply() 函数则是在 API level 9 中引入的。commit() 函数会返回一个布尔值,表示磁盘写入操作是否成功,而使用 apply() 函数则需要自己去尽力而为。 - Xavier Rubio Jansana
非常有信息量的评论。谢谢@Tim。 - nandur

4
apply()方法会将数据先写入一个临时的Map,然后异步地写入磁盘。如果你立即使用像getBoolean()这样的方法,它会首先在临时的Map中查找是否有与该键匹配的值,然后返回该值。请查看SharedPreferencesImpl的源代码以了解其确切工作方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,