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

时间:2011-05-11 07:26:01

标签: android sharedpreferences

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

9 个答案:

答案 0 :(得分:603)

在2.3中添加了

apply(),它提交了而没有返回一个表示成功或失败的布尔值。

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

添加了

apply(),因为Android开发团队注意到几乎没有人注意到返回值,因此应用速度更快,因为它是异步的。

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

答案 1 :(得分:195)

<强> TL; DR:

  • commit()将数据同步写入(阻止其调用的线程)。然后告知您操作是否成功。
  • apply()安排要写入异步的数据。 没有通知您关于操作是否成功。
  • 如果您通过任何getX方法保存apply()立即阅读,则会返回值!
  • 如果您在某个时刻拨打apply()并且它仍在执行,则对commit()的任何调用都会阻止,直到所有过去的应用调用当前的提交调用完成

来自SharedPreferences.Editor文档的更深入的信息:

  

与写入其的 commit()不同   偏好到持久存储   同步 apply()提交它   更改内存中   SharedPreferences立即但是   启动异步提交到磁盘   并且您不会收到任何通知   故障即可。如果是另一个编辑就此   SharedPreferences定期执行   commit()仍然是apply()   杰出的,commit()会阻塞   直到所有异步提交完成   以及提交本身。

     

作为SharedPreferences实例   一个过程中的单身人士,这是安全的   替换commit()的任何实例   如果你已经使用apply()   忽略了返回值。

     

SharedPreferences.Editor接口   预计不会实施   直。但是,如果你以前   确实实现了它,现在正在实现   关于缺少apply()的错误,你可以   只需从apply()调用commit()。

答案 2 :(得分:22)

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

如果您“强制扣留”程序,或者在我使用Android 4.1安装在我的设备上的ROM中,当系统因内存需要而导致该进程被终止时,就会发生这种情况。

如果您希望自己的偏好生效,我建议使用“commit()”代替“apply()”。

答案 3 :(得分:13)

使用apply()。

它立即将更改写入RAM并等待并将其写入内部存储(实际首选项文件)之后。 Commit将更改同步并直接写入文件。

答案 4 :(得分:12)

文档很好地解释了apply()commit()之间的区别:

  

commit()不同,后者将其首选项写入持久性   同步存储,apply()将其更改提交到内存中   SharedPreferences立即启动异步提交   磁盘,您不会收到任何故障通知。如果是其他编辑   这个SharedPreferences定期commit()apply()commit()   仍然未完成,SharedPreferences将阻止,直到所有异步提交为止   完成以及提交本身。作为commit()个实例   在进程中是单例,可以安全地替换任何实例   如果你已经忽略了返回值,apply() {{1}}。

答案 5 :(得分:12)

  • commit()是同步的,apply()是异步的

  • apply()是无效功能。

  • 如果新值已成功写入持久存储,则
  • commit()返回true。

  • apply()保证在切换状态之前完成,您不必担心Android组件生命周期

如果您不使用从commit()返回的值并且您从主线程中使用commit(),请使用apply()代替commit()

答案 6 :(得分:6)

来自javadoc:

  

与commit()不同,后者写入它   偏好到持久存储   同步,apply()提交它   更改内存中   SharedPreferences立即但是   启动异步提交到磁盘   并且您不会收到任何通知   故障。如果此SharedPreferences上的另一个编辑器执行常规commit()而a&gt; apply()仍然未完成,commit()将阻塞,直到完成所有异步提交以及提交本身

答案 7 :(得分:0)

  

commit()和apply()之间的区别

在使用SharedPreference时,我们可能会对这两个术语感到困惑。基本上它们可能是相同的,所以让我们澄清一下commit()和apply()的区别。

  

1。返回值:

apply()提交时不返回表示成功或失败的布尔值。 commit()如果保存成功,则返回true,否则返回false。

  
      
  1. 速度:
  2.   

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

  
      
  1. 异步v.s.同步:
  2.   

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

  
      
  1. 原子:
  2.   

apply():原子 commit():原子

  
      
  1. 错误通知:
  2.   

apply():否 commit():是

答案 8 :(得分:0)

commit()同步写入数据,并根据结果立即返回成功或失败的布尔值。

apply() 是一个同步,它不会返回任何布尔响应。此外,如果存在未完成的 apply() 并且我们执行另一个 commit()。 commit() 将被阻塞,直到 apply() 未完成。