共享首选项中的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提交完成以及提交本身