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

在Android中,SharedPreferences的commit()方法是同步的,会立即写入并返回是否成功,而apply()方法则是异步的,仅将更改写入内存并稍后写入磁盘,不返回确认结果。如果在不关心返回值的情况下,可以使用apply()以提高效率,但需要注意异步写入可能存在的数据丢失风险。
摘要由CSDN通过智能技术生成

我在我的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。

  1. 速度:

apply()更快。 commit()比较慢。

  1. 异步与同步:

apply() :异步commit() :同步

  1. 原子:

apply() :atomic commit() :atomic

  1. 错误通知:

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()任何实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值