SharedPreferences中的commit()和apply()有什么区别

我在我的android应用程序中使用SharedPreferences。我从共享偏好中使用commit()apply()方法。当我使用avd2.3时,它显示没有错误,但当我在avd2.1中运行代码时,apply()方法显示错误。

这两者有什么区别呢?并且仅使用commit(),我可以存储首选项值没有任何问题吗?

156728 次浏览

apply()是在2.3中添加的,它提交没有,返回一个布尔值,表示成功或失败。

如果保存有效,commit()返回真正的,否则返回

添加apply()是因为Android开发团队注意到几乎没有人注意到返回值,所以apply更快,因为它是异步的。

< a href = " http://developer.android.com/reference/android/content/SharedPreferences.Editor.html应用()" > http://developer.android.com/reference/android/content/SharedPreferences.Editor.html应用()< / >

从javadoc:

不像commit(),它写它的 首选项输出到持久存储 同时,apply()提交它的 内存中的更改 SharedPreferences,但是 启动对磁盘的异步提交 我不会通知你的 失败。如果这个SharedPreferences上的另一个编辑器在> apply()仍然未完成时执行常规提交(),则commit()将阻塞,直到所有异步提交以及提交本身都完成

tl;博士:

  • commit()写入数据同步(阻塞调用它的线程)。然后它通知你关于操作的成功。
  • apply()调度要写入的数据异步。它让你对手术的成功感到惊讶。
  • 如果你通过任何getx方法保存apply()马上读,将返回值!
  • 如果你在某个时候调用了apply()并且它仍在执行,任何对commit()的调用都将阻塞,直到所有过去的apply-calls 而且(当前的提交调用)都完成。

更多深入的信息来自SharedPreferences。编辑器文档:

不像commit(),它写入它的 首选项输出到持久存储 同时apply()提交它的 内存中的更改 SharedPreferences,但是 启动对磁盘的异步提交 我不会通知你的 失败> < /强。如果另一个编辑就这样了 SharedPreferences执行常规操作 Commit()而apply()仍然存在 未完成,commit()将阻塞 直到所有异步提交完成 以及提交本身

作为SharedPreferences实例 进程中的单例,这是安全的 替换commit()的任何实例 如果已经使用了apply()

.忽略返回值 < p > SharedPreferences。编辑界面 预计不会被实现 直接。然而,如果你以前 实施了吗?现在得到了吗 关于错过apply()的错误,您可以 只需从apply()调用commit()

文档对apply()commit()之间的区别给出了很好的解释:

commit()不同,后者将其首选项写入持久化 apply()将其更改提交到内存中 SharedPreferences立即执行,但会启动一个异步提交 磁盘,您将不会收到任何故障通知。如果另一个编辑 SharedPreferences执行常规的commit(),而apply()执行常规的apply() 如果仍然未完成,commit()将阻塞,直到所有异步提交完成 和提交本身一样完成。作为SharedPreferences实例 进程中的单例对象是否可以安全替换其实例 如果你已经忽略了返回值,则返回commit()apply()

我使用apply()而不是commit()遇到了一些问题。正如前面在其他响应中所述,apply()是异步的。我得到的问题是,形成一个“字符串集”偏好的变化从来没有写到持久内存。

如果你“强制扣留”程序,或者在我安装在Android 4.1设备上的ROM中,由于内存需求进程被系统杀死,就会发生这种情况。

如果你想激活你的首选项,我建议使用“commit()”而不是“apply()”。

使用适用于()。

它立即将更改写入RAM,然后等待并将其写入内部存储(实际的首选项文件)。Commit同步且直接地将更改写入文件。

  • commit()是同步的,apply()是异步的

  • apply()是void函数。

  • 如果新值成功写入持久存储,commit()返回true。

  • apply()保证在切换状态前完成,你不需要担心Android组件的生命周期

如果你不使用从commit()返回的值,并且你从主线程中使用commit(),请使用apply()而不是commit()

commit()和apply()的区别

当我们使用SharedPreference时,我们可能会被这两个术语混淆。基本上它们可能是相同的,因此让我们澄清commit()和apply()的区别。

1.返回值:

apply()提交而不返回布尔值表示成功或失败。 commit()如果保存有效返回true,否则返回false

  1. 速度:

apply()更快。

. commit()比较慢
  1. 异步vs .同步:
< p > apply():异步的 commit():同步< / p >
  1. 原子性:
< p > apply():原子 commit():原子< / p >
  1. 错误通知:
< p > apply():没有 commit():是的< / p >