共享首选项中的commit()和apply()有什么区别

我在我的Android应用程序中使用共享偏好。 我使用共享首选项中的commit()apply()方法。 当我使用AVD 2.3时,显示没有错误,但是当我在AVD 2.1中运行代码时, apply()方法显示错误。 那么这两者有什么区别呢? 而只使用commit()我可以存储的偏好值没有任何问题?

apply()在2.3中被添加,它提交时返回一个指示成功或失败的布尔值。

如果保存有效,则commit()返回true ,否则返回false

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

http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply();

TL;博士:

  • commit() 同步写入数据(阻塞从其调用的线程)。 然后它会通知您操作的成功。
  • apply()调度要asynchronous写入的数据。 它并没有通知你有关手术的成功。
  • 如果使用apply()保存并通过任何getX方法立即读取 ,则新的值将被返回!
  • 如果你在某个时候调用了apply() ,并且它仍然在执行,那么任何对commit()的调用都将被阻塞,直到所有的应用调用和它自己的提交完成。

来自SharedPreferences.Editor文档的更深入的信息:

commit()不同, commit()会将其首选项同步写入持久性存储中apply()会立即将其更改提交到内存中的SharedPreferences,但会启动对磁盘的asynchronous提交,并且不会通知任何失败 。 如果此SharedPreferences上的另一个编辑器在apply()仍未完成时执行常规commit(),则commit()将会阻塞,直到完成所有asynchronous提交以及提交本身。

由于SharedPreferences实例是一个进程中的单例,如果您已经忽略了返回值,则可以使用apply()replace任何commit()的实例。

SharedPreferences.Editor接口不希望直接实现。 但是,如果您之前已经实现了它,并且现在正在获取有关缺lessapply()的错误,则可以仅从apply()调用commit()。

我遇到一些问题,使用apply()而不是commit()。 如之前在其他回复中所述,apply()是asynchronous的。 我得到的问题是,形成“string集”首选项的更改永远不会写入持久性内存。

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

如果你想让你的首选项活着,我推荐使用“commit()”而不是“apply()”。

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

commit()不同, commit()会将其首选项同步写入持久性存储中, apply()将其更改提交到内存中的SharedPreferences ,但会启动对磁盘的asynchronous提交,并且不会通知任何失败。 如果此SharedPreferences上的另一个编辑器在apply()仍未完成时执行常规commit() ,则commit()将会阻塞,直到完成所有asynchronous提交以及提交本身。 由于SharedPreferences实例是一个进程中的单例,如果您已经忽略了返回值,则可以使用apply()replace任何commit()实例。

使用apply()。

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

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

  • apply()是void函数。

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

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

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

来自javadoc:

与commit()不同,commit()会将其首选项同步写入持久性存储中,apply()会立即将其更改提交到内存中的SharedPreferences,但会启动对磁盘的asynchronous提交,并且不会通知任何失败。 如果这个SharedPreferences上的另一个编辑器在一个> apply()仍然未完成的时候执行了一个常规的commit(),那么commit()将会被阻塞,直到所有的asynchronous提交完成以及提交本身