美文网首页
SharedPreferences的apply和commit两种

SharedPreferences的apply和commit两种

作者: 业精于勤_荒于嬉 | 来源:发表于2020-04-04 08:26 被阅读0次

    关于SharedPreferences我们在Android开发中经常使用到,SharedPreferences有apply和commit两种提交方式:

    /**
         * 保存到本地SharedPreferences的boolean数据
         *
         * @param context 传入的上下文对象
         * @param key     得到数据的标识
         * @param value   如果获得不到的默认值
         */
        public static void putPreBoolean(Context context, String key, boolean value) {
            if (pre==null){
                pre = context.getSharedPreferences(CONFIG_NAME, Context.MODE_PRIVATE);
            }
            pre.edit().putBoolean(key, value).commit();
        }
    
    /**
         * 保存到本地SharedPreferences的boolean数据
         *
         * @param context 传入的上下文对象
         * @param key     得到数据的标识
         * @param value   如果获得不到的默认值
         */
        public static void putPreBoolean(Context context, String key, boolean value) {
            if (pre==null){
                pre = context.getSharedPreferences(CONFIG_NAME, Context.MODE_PRIVATE);
            }
            pre.edit().putBoolean(key, value).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 commit wins.
             *
             * <p>If you don't care about the return value and you're
             * using this from your application's main thread, consider
             * using {@link #apply} instead.
             *
             * @return Returns true if the new values were successfully written
             * to persistent storage.
             */
            boolean commit();
    
            /**
             * 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是有返回值,所以使用apply提交之后,无法判定是否提交成功,而commit方式可以返回是否提交成功的布尔值,所以在需要得到返回值的情况下建议使用commit方式
    (2)apply操作是一个原子性的操作,是先把数据提交到内存中,然后再通过异步任务提交到硬件磁盘上。而commit是个同步操作,直接把数据提交到硬件磁盘上。因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。

    总结:

    在开发中如果我们需要返回值的情况(一般不需要),那就选用commit方式。其他情况,建议选用效率比较高的apply方式。
    注意:SharedPreferences能够存储的数据类型:String、Int、Long、Float、Boolean、Set<String>

    相关文章

      网友评论

          本文标题:SharedPreferences的apply和commit两种

          本文链接:https://www.haomeiwen.com/subject/toqdphtx.html