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

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


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

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

由于Android开发团队注意到几乎没有人注意到返回值,因此apply()被添加,因此应用程序更快,因为它是异步的。

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


TL;博士:

  • commit() 同步写入数据(阻塞从其调用的线程)。 然后它会通知您操作的成功。
  • apply()调度要异步写入的数据。 它没有通知您操作的成功。
  • 如果使用apply()保存并通过任何getX方法立即读取 ,则将返回值!
  • 如果你在某个时刻调用了apply()并且它仍然在执行,那么任何对commit()的调用都将被阻塞,直到所有过去的apply-calls和当前的commit-call完成。
  • 来自SharedPreferences.Editor文档的更深入的信息:

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

    由于SharedPreferences实例是流程中的单例,因此如果您已经忽略了返回值,则可以使用apply()替换任何commit()的实例。

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


    我遇到一些问题,使用apply()而不是commit()。 如之前在其他回复中所述,apply()是异步的。 我遇到的问题是,对“字符串集”首选项所做的更改永远不会写入持久内存。

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

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

    链接地址: http://www.djcxy.com/p/54077.html

    上一篇: What's the difference between commit() and apply() in Shared Preference

    下一篇: Deleting shared preferences