我在我的Android应用中使用共享首选项。我使用共享首选项中的commit()
和apply()
方法。当我使用AVD 2.3时它没有显示错误,但是当我在AVD 2.1中运行代码时,apply()
方法显示错误。
那么这两者有什么区别?只使用commit()
我可以存储首选项值而没有任何问题吗?
答案 0 :(得分:603)
apply()
,它提交了而没有返回一个表示成功或失败的布尔值。
commit()
如果保存有效,则返回 true ,否则返回 false 。
apply()
,因为Android开发团队注意到几乎没有人注意到返回值,因此应用速度更快,因为它是异步的。
http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply()
答案 1 :(得分:195)
<强> TL; DR:强>
commit()
将数据同步写入(阻止其调用的线程)。然后告知您操作是否成功。apply()
安排要写入异步的数据。 没有通知您关于操作是否成功。apply()
并立即阅读,则会返回新值!apply()
并且它仍在执行,则对commit()
的任何调用都会阻止,直到所有过去的应用调用和当前的提交调用完成来自SharedPreferences.Editor文档的更深入的信息:
与写入其的 commit()不同 偏好到持久存储 同步, apply()提交它 更改内存中 SharedPreferences立即但是 启动异步提交到磁盘 并且您不会收到任何通知 故障即可。如果是另一个编辑就此 SharedPreferences定期执行 commit()仍然是apply() 杰出的,commit()会阻塞 直到所有异步提交完成 以及提交本身。
作为SharedPreferences实例 一个过程中的单身人士,这是安全的 替换commit()的任何实例 如果你已经使用apply() 忽略了返回值。
SharedPreferences.Editor接口 预计不会实施 直。但是,如果你以前 确实实现了它,现在正在实现 关于缺少apply()的错误,你可以 只需从apply()调用commit()。
答案 2 :(得分:22)
我在使用apply()而不是commit()时遇到了一些问题。如前面在其他响应中所述,apply()是异步的。我遇到的问题是,对“字符串集”首选项形成的更改永远不会写入持久性内存。
如果您“强制扣留”程序,或者在我使用Android 4.1安装在我的设备上的ROM中,当系统因内存需要而导致该进程被终止时,就会发生这种情况。
如果您希望自己的偏好生效,我建议使用“commit()”代替“apply()”。
答案 3 :(得分:13)
使用apply()。
它立即将更改写入RAM并等待并将其写入内部存储(实际首选项文件)之后。 Commit将更改同步并直接写入文件。
答案 4 :(得分:12)
文档很好地解释了apply()
和commit()
之间的区别:
与
commit()
不同,后者将其首选项写入持久性 同步存储,apply()
将其更改提交到内存中SharedPreferences
立即启动异步提交 磁盘,您不会收到任何故障通知。如果是其他编辑 这个SharedPreferences
定期commit()
而apply()
是commit()
仍然未完成,SharedPreferences
将阻止,直到所有异步提交为止 完成以及提交本身。作为commit()
个实例 在进程中是单例,可以安全地替换任何实例 如果你已经忽略了返回值,apply()
{{1}}。
答案 5 :(得分:12)
commit()
是同步的,apply()
是异步的
apply()
是无效功能。
commit()
返回true。
apply()
保证在切换状态之前完成,您不必担心Android组件生命周期
如果您不使用从commit()
返回的值并且您从主线程中使用commit()
,请使用apply()
代替commit()
答案 6 :(得分:6)
来自javadoc:
与commit()不同,后者写入它 偏好到持久存储 同步,apply()提交它 更改内存中 SharedPreferences立即但是 启动异步提交到磁盘 并且您不会收到任何通知 故障。如果此SharedPreferences上的另一个编辑器执行常规commit()而a&gt; apply()仍然未完成,commit()将阻塞,直到完成所有异步提交以及提交本身
答案 7 :(得分:0)
commit()和apply()之间的区别
在使用SharedPreference时,我们可能会对这两个术语感到困惑。基本上它们可能是相同的,所以让我们澄清一下commit()和apply()的区别。
1。返回值:
apply()
提交时不返回表示成功或失败的布尔值。
commit(
)如果保存成功,则返回true,否则返回false。
- 速度:
apply()
更快。
commit()
较慢。
- 异步v.s.同步:
apply()
:异步
commit()
:同步
- 原子:
apply()
:原子
commit()
:原子
- 错误通知:
apply()
:否
commit()
:是
答案 8 :(得分:0)
commit()同步写入数据,并根据结果立即返回成功或失败的布尔值。
apply() 是一个同步,它不会返回任何布尔响应。此外,如果存在未完成的 apply() 并且我们执行另一个 commit()。 commit() 将被阻塞,直到 apply() 未完成。