转载请标明出处:
http://www.jianshu.com/p/7be25bfb4cb4
本文出自:
http://www.jianshu.com/u/a1251e598483
在以往的开发中存储数据时经常用SharedPreference, 并且在提交数据时一直用的是Editor的commit方法,今天看郭神的第一行代码中举例子用的都是apply。所以就想弄清楚,SharedPreference.Editor的apply和commit到底有什么区别。
下面是查的官方文档
apply
void apply ()
Commit your preferences changes back from this Editor to the SharedPreferences object it is editing. This atomically performs the requested modifications, replacing whatever is currently in the SharedPreferences.
Note that when two editors are modifying preferences at the same time, the last one to call apply wins.
Unlike commit(), which writes its preferences out to persistent storage synchronously, apply() commits its changes to the in-memorySharedPreferences immediately but starts an asynchronous commit to disk and you won't be notified of any failures. If another editor on thisSharedPreferencesdoes a regular commit()
while a apply() is still outstanding, the commit() will block until all async commits are completed as well as the commit itself.
As SharedPreferencesinstances are singletons within a process, it's safe to replace any instance of commit() with apply() if you were already ignoring the return value.
You don't need to worry about Android component lifecycles and their interaction with apply() writing to disk. The framework makes sure in-flight disk writes from apply()
complete before switching states.
翻译 :在编辑中调用 Editor 的提交方法 apply(),这将原子地执行所请求的修改,替换当前在SharedPreferences中的任何内容。
注意:当在同一时间有两个 editors 修改 preferences的内容时,以最后一个修改的为准。
与 commit()方法不同的是 commit()方法是同步地储存在磁盘上,apply()是先储存在内存中,然后异步的储存在磁盘上且不会有任何失败的提示;如果apply()异步的内容尚未储存带磁盘上,另一个editor调用了commit()同步提交储存,这个操作将会等待另一个commit()操作完成后才会真正执行。
由于SharedPreferences 在一个进程中是单例的,所以如果你不关心commit()成功与否的,完全可以用apply()来代替。
你不需要担心Android组件生命周期及其与apply()写入磁盘的交互。该框架确保来自apply()的在线磁盘写入在切换状态之前完成。
commit
boolean commit ()
Commit your preferences changes back from this Editor to the SharedPreferences object it is editing. This atomically performs the requested modifications, replacing whatever is currently in the SharedPreferences.
Note that when two editors are modifying preferences at the same time, the last one to call commit wins.
If you don't care about the return value and you're using this from your application's main thread, consider using apply()
instead.
翻译:在编辑中调用 Editor 的提交方法 apply(),这将原子地执行所请求的修改,替换当前在SharedPreferences中的任何内容。
注意:当在同一时间有两个 editors 修改 preferences的内容时,以最后一个修改的为准。
如果你在主线程上调用此方法,且不关心储存成功与否的返回值,你可以直接使用 appply() 。
两个方法区别:
- apply没有返回值而commit有返回表明修改是否成功
- apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。
- apply方法不会提示任何失败的提示。
由于在一个进程中,sharedPreference是单实例,一般不会出现并发冲突,如果对提交的结果不关心的话,建议使用apply()。
详细内容可以查看官方参考 :
https://developer.android.google.cn/reference/android/content/SharedPreferences.Editor.html