【常用工具类】SharedPreferences封装类SPUtils

来源:互联网 发布:p2p网络投资理财 编辑:程序博客网 时间:2024/04/30 16:22
public class SPUtils {    /**     * 保存在手机里面的文件名     */    public static final String FILE_NAME = "share_data";    /**     * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法     *     * @param context     * @param key     * @param object     */    public static void put(Context context, String key, Object object) {        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);        SharedPreferences.Editor editor = sp.edit();        if (object instanceof String) {            editor.putString(key, (String) object);        } else if (object instanceof Integer) {            editor.putInt(key, (Integer) object);        } else if (object instanceof Boolean) {            editor.putBoolean(key, (Boolean) object);        } else if (object instanceof Float) {            editor.putFloat(key, (Float) object);        } else if (object instanceof Long) {            editor.putLong(key, (Long) object);        } else {            editor.putString(key, object.toString());        }        SharedPreferencesCompat.apply(editor);    }    /**     * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值     *     * @param context     * @param key     * @param defaultObject     * @return     */    public static Object get(Context context, String key, Object defaultObject) {        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,                Context.MODE_PRIVATE);        if (defaultObject instanceof String) {            return sp.getString(key, (String) defaultObject);        } else if (defaultObject instanceof Integer) {            return sp.getInt(key, (Integer) defaultObject);        } else if (defaultObject instanceof Boolean) {            return sp.getBoolean(key, (Boolean) defaultObject);        } else if (defaultObject instanceof Float) {            return sp.getFloat(key, (Float) defaultObject);        } else if (defaultObject instanceof Long) {            return sp.getLong(key, (Long) defaultObject);        }        return null;    }    /**     * 移除某个key值已经对应的值     *     * @param context     * @param key     */    public static void remove(Context context, String key) {        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,                Context.MODE_PRIVATE);        SharedPreferences.Editor editor = sp.edit();        editor.remove(key);        SharedPreferencesCompat.apply(editor);    }    /**     * 清除所有数据     *     * @param context     */    public static void clear(Context context) {        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,                Context.MODE_PRIVATE);        SharedPreferences.Editor editor = sp.edit();        editor.clear();        SharedPreferencesCompat.apply(editor);    }    /**     * 查询某个key是否已经存在     *     * @param context     * @param key     * @return     */    public static boolean contains(Context context, String key) {        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,                Context.MODE_PRIVATE);        return sp.contains(key);    }    /**     * 返回所有的键值对     *     * @param context     * @return     */    public static Map<String, ?> getAll(Context context) {        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,                Context.MODE_PRIVATE);        return sp.getAll();    }    /**     * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类     *     * @author zhy     */    private static class SharedPreferencesCompat {        private static final Method sApplyMethod = findApplyMethod();        /**         * 反射查找apply的方法         *         * @return         */        @SuppressWarnings({"unchecked", "rawtypes"})        private static Method findApplyMethod() {            try {                Class clz = SharedPreferences.Editor.class;                return clz.getMethod("apply");            } catch (NoSuchMethodException e) {            }            return null;        }        /**         * 如果找到则使用apply执行,否则使用commit         *         * @param editor         */        public static void apply(SharedPreferences.Editor editor) {            try {                if (sApplyMethod != null) {                    sApplyMethod.invoke(editor);                    return;                }            } catch (IllegalArgumentException e) {            } catch (IllegalAccessException e) {            } catch (InvocationTargetException e) {            }            editor.commit();        }    }}

对 SharedPreference 的使用做了建议的封装,对外公布出 put,get,remove,clear 等等方法;
注意一点,里面所有的 commit 操作使用了 SharedPreferencesCompat.apply 进行了替代,目的是尽可能的使用 apply 代替 commit
首先说下为什么,因为 commit 方法是同步的,并且我们很多时候的 commit 操作都是 UI 线程中,毕竟是 IO 操作,尽可能异步;
所以我们使用 apply 进行替代,apply 异步的进行写入;
但是 apply 相当于 commit 来说是 new API 呢,为了更好的兼容,我们做了适配;
SharedPreferencesCompat 也可以给大家创建兼容类提供了一定的参考~~

0 0