我在我的Android应用程序中使用共享首选项。 我正在使用共享首选项中的commit()
和apply()
方法。 当我使用AVD 2.3时它没有显示错误,但是当我在AVD 2.1中运行代码时, apply()
方法显示错误。 那么这两者有什么区别? 通过只使用commit()
,我可以存储首选项值没有任何问题吗?
#1楼
我在使用apply()而不是commit()时遇到了一些问题。 如前面在其他响应中所述,apply()是异步的。 我遇到的问题是,对“字符串集”首选项形成的更改永远不会写入持久性内存。
如果您“强行扣留”程序,或者在我使用Android 4.1安装在我的设备上的ROM中,当系统由于内存需要而导致该进程被终止时,就会发生这种情况。
如果您希望自己的偏好存活,我建议使用“commit()”而不是“apply()”。
#2楼
使用apply()。
它立即将更改写入RAM并等待并将其写入内部存储(实际首选项文件)之后。 Commit将更改同步并直接写入文件。
#3楼
commit()
是同步的,apply()
是异步的apply()
是void函数。如果新值已成功写入持久存储,则
commit()
返回true。apply()
保证在切换状态之前完成,您不必担心Android组件的生命周期
如果你不使用从commit()
返回的值,并且你从主线程使用commit()
,请使用apply()
而不是commit()
#4楼
commit()和apply()之间的区别
当我们使用SharedPreference时,我们可能会对这两个术语感到困惑。 基本上它们可能是相同的,所以让我们澄清commit()和apply()的区别。
1.返回值:
apply()
提交而不返回指示成功或失败的布尔值。 如果保存工作, commit(
)返回true,否则返回false。
- 速度:
apply()
更快。 commit()
比较慢。
- 异步与同步:
apply()
:异步commit()
:同步
- 原子:
apply()
:atomic commit()
:atomic
- 错误通知:
apply()
:没有commit()
:是的
#5楼
apply()
在2.3中添加,它提交时不返回表示成功或失败的布尔值。
如果保存工作, commit()
返回true ,否则返回false 。
apply()
被添加,因为Android开发团队注意到几乎没有人注意到返回值,因此apply更快,因为它是异步的。
http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply()
#6楼
来自javadoc:
与commit()同步地将其首选项写入持久存储,apply()会立即将其更改提交到内存中的SharedPreferences,但会启动异步提交到磁盘,并且不会通知您任何失败。 如果此SharedPreferences上的另一个编辑器执行常规commit()而> apply()仍未完成,则commit()将阻塞,直到完成所有异步提交以及提交本身
#7楼
TL;博士:
-
commit()
同步写入数据(阻塞调用它的线程)。 然后它会通知您操作的成功。 -
apply()
调度要异步写入的数据。 它不会告诉您操作是否成功。 - 如果使用
apply()
保存并立即通过任何getX方法读取 ,则将返回新值! - 如果您在某个时刻调用了
apply()
并且它仍在执行,则对commit()
任何调用都将阻塞,直到所有过去的apply-calls 和当前的commit-call完成为止。
来自SharedPreferences.Editor文档的更深入信息:
与commit()同步地将其首选项写入持久存储 , apply()会立即将其更改提交到内存中的SharedPreferences,但会启动异步提交到磁盘,并且不会通知您任何失败 。 如果此SharedPreferences上的另一个编辑器在apply()尚未完成时执行常规commit(),则commit()将阻塞,直到完成所有异步提交以及提交本身。
由于SharedPreferences实例是进程中的单例,因此如果您已经忽略了返回值,则可以使用apply()替换commit()的任何实例。
SharedPreferences.Editor接口不应直接实现。 但是,如果您之前已实现它并且现在收到有关缺少apply()的错误,则只需从apply()调用commit()即可。
#8楼
这些文档很好地解释了apply()
和commit()
之间的区别:
与
commit()
同步地将其首选项写入持久存储,apply()
将其更改提交到内存中的SharedPreferences
,但会启动异步提交到磁盘,并且不会通知您任何失败。 如果此SharedPreferences
上的另一个编辑器在apply()
尚未完成时执行常规commit()
,则commit()
将阻塞,直到完成所有异步提交以及提交本身。 由于SharedPreferences
实例是进程中的单例,因此如果您已经忽略了返回值,则可以使用apply()
替换commit()
任何实例。