commit(),但Android建议我使用apply(),因为它在后台运行且不会阻塞主线程。
如果我使用apply,这样的操作是否有效?或者说,在调用之前,apply未能更新它是可能的吗?
editor.putBoolean("TEST", true)
editor.apply()
if (preferences.getBoolean("TEST")) {
//do something
}
commit(),但Android建议我使用apply(),因为它在后台运行且不会阻塞主线程。
如果我使用apply,这样的操作是否有效?或者说,在调用之前,apply未能更新它是可能的吗?
editor.putBoolean("TEST", true)
editor.apply()
if (preferences.getBoolean("TEST")) {
//do something
}
根据文档所述,我希望它能够正常工作:
apply()立即将其更改提交到内存中的SharedPreferences,但启动了异步提交到磁盘,并且您将不会收到任何失败通知。
由于您正在访问相同的首选项对象(是单例),因此始终应该看到一致的视图。
apply()方法会将数据先写入一个临时的Map,然后异步地写入磁盘。如果你立即使用像getBoolean()这样的方法,它会首先在临时的Map中查找是否有与该键匹配的值,然后返回该值。请查看SharedPreferencesImpl的源代码以了解其确切工作方式。
commit()函数在原始的 API level 1 中就已经存在了,而apply()函数则是在 API level 9 中引入的。commit()函数会返回一个布尔值,表示磁盘写入操作是否成功,而使用apply()函数则需要自己去尽力而为。 - Xavier Rubio Jansana