在Android应用开发中,SharedPreference在数据存储时是经常用到的。之前项目中一般都是用commit,今天在敲代码的时候,AS推荐我将commit改成apply,于是就好奇点进去看了下。
apply方法在源码中说明如下:
/** * Commit your preferences changes back from this Editor to the * {@link SharedPreferences} object it is editing. This atomically * performs the requested modifications, replacing whatever is currently * in the SharedPreferences. * * <p>Note that when two editors are modifying preferences at the same * time, the last one to call apply wins. * * <p>Unlike {@link #commit}, which writes its preferences out * to persistent storage synchronously, {@link #apply} * commits its changes to the in-memory * {@link SharedPreferences} immediately but starts an * asynchronous commit to disk and you won't be notified of * any failures. If another editor on this * {@link SharedPreferences} does a regular {@link #commit} * while a {@link #apply} is still outstanding, the * {@link #commit} will block until all async commits are * completed as well as the commit itself. * * <p>As {@link SharedPreferences} instances are singletons within * a process, it's safe to replace any instance of {@link #commit} with * {@link #apply} if you were already ignoring the return value. * * <p>You don't need to worry about Android component * lifecycles and their interaction with <code>apply()</code> * writing to disk. The framework makes sure in-flight disk * writes from <code>apply()</code> complete before switching * states. * * <p class='note'>The SharedPreferences.Editor interface * isn't expected to be implemented directly. However, if you * previously did implement it and are now getting errors * about missing <code>apply()</code>, you can simply call * {@link #commit} from <code>apply()</code>. */ void apply();这两个方法的具体区别在于:
1.apply没有返回值;commit返回值类型为boolean,表明修改是否提交成功
2.apply是先将修改数据提交到内存中,之后再异步提交到硬件磁盘中;而commit是同步提交到磁盘,因此,在多个并发的提交保存数据的时候,commit会等待正在处理的commit保存到磁盘后再操作,从而降低了效率。而apply会先将数据提交到内存中,后面调用apply的函数时,会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率
3.apply方法不会有任何失败的提示。