共享首选项中的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