SharedPreferences工具类

本文介绍了使用SharedPreferences的注意事项,如不要存放大的key和value,不相关配置项不要放一起,读取频繁和不易变动的key尽量分开,避免乱edit和apply,尽量不存放JSON和HTML等,还提及了封装SharedPreferences。

版权声明:本文为延成原创文章,转载请标明出处

使用SharedPreferences的注意事项:

  • 1.不要存放大的key和value!我就不重复三遍了,会引起界面卡、频繁GC、占用内存等等,好自为之!
  • 2.毫不相关的配置项就不要丢在一起了!文件越大读取越慢,不知不觉就被猪队友给坑了;蓝后,放进defalut的那个简直就是愚蠢行为!
  • 3.读取频繁的key和不易变动的key尽量不要放在一起,影响速度。(如果整个文件很小,那么忽略吧,为了这点性能添加维护成本得不偿失)
  • 4.不要乱edit和apply,尽量批量修改一次提交!
  • 5.尽量不要存放JSON和HTML,这种场景请直接使用json!

封装SharedPreferences


public class SPUtil {

    private static final String FILE_NAME = "share_date";
    private static SPUtil mInstance;
    private static SharedPreferences mSharedPreferences;
    private static SharedPreferences.Editor mEditor;

    public synchronized static SPUtil getInstance(Context context) {

        if (mInstance == null) {
            mInstance = new SPUtil(context.getApplicationContext());
        }

        return mInstance;
    }

    private SPUtil(Context context) {

        mSharedPreferences = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        mEditor = mSharedPreferences.edit();
    }

    /**
     * 保存数据到SharedPreferences
     *
     * @param key
     * @param object
     */
    public static void setData(String key, Object object) {

        String type = object == null ? "" : object.getClass().getSimpleName();

        switch (type) {
            case "String":
                mEditor.putString(key, (String) object);
                break;
            case "Integer":
                mEditor.putInt(key, (Integer) object);
                break;
            case "Boolean":
                mEditor.putBoolean(key, (Boolean) object);
                break;
            case "Float":
                mEditor.putFloat(key, (Float) object);
                break;
            case "Long":
                mEditor.putLong(key, (Long) object);
                break;
        }
        mEditor.apply();
    }


    /**
     * 获取SharedPreferences中保存的数据
     *
     * @param key
     * @param defaultObject
     * @return
     */
    public static Object getData(String key, Object defaultObject) {
        Object result;
        String type = defaultObject == null ? "" : defaultObject.getClass().getSimpleName();
        switch (type) {
            case "String":
                result = mSharedPreferences.getString(key, (String) defaultObject);
                break;
            case "Integer":
                result = mSharedPreferences.getInt(key, (Integer) defaultObject);
                break;
            case "Boolean":
                result = mSharedPreferences.getBoolean(key, (Boolean) defaultObject);
                break;
            case "Float":
                result = mSharedPreferences.getFloat(key, (Float) defaultObject);
                break;
            case "Long":
                result = mSharedPreferences.getLong(key, (Long) defaultObject);
                break;
            default:
                result = null;
                break;
        }

        return result;
    }

    /**
     * 用于保存集合
     *
     * @param key  key
     * @param list 集合数据
     * @return 保存结果
     */
    public static <T> boolean setListData(String key, List<T> list) {
        boolean result;
        String type = list.get(0).getClass().getSimpleName();
        JsonArray array = new JsonArray();
        try {
            switch (type) {
                case "Boolean":
                    for (int i = 0; i < list.size(); i++) {
                        array.add((Boolean) list.get(i));
                    }
                    break;
                case "Long":
                    for (int i = 0; i < list.size(); i++) {
                        array.add((Long) list.get(i));
                    }
                    break;
                case "Float":
                    for (int i = 0; i < list.size(); i++) {
                        array.add((Float) list.get(i));
                    }
                    break;
                case "String":
                    for (int i = 0; i < list.size(); i++) {
                        array.add((String) list.get(i));
                    }
                    break;
                case "Integer":
                    for (int i = 0; i < list.size(); i++) {
                        array.add((Integer) list.get(i));
                    }
                    break;
                default:
                    Gson gson = new Gson();
                    for (int i = 0; i < list.size(); i++) {
                        JsonElement obj = gson.toJsonTree(list.get(i));
                        array.add(obj);
                    }
                    break;
            }
            mEditor.putString(key, array.toString());
            result = true;
        } catch (Exception e) {
            result = false;
            e.printStackTrace();
        }
        mEditor.apply();
        return result;
    }

    /**
     * 获取保存的List
     *
     * @param key key
     * @return 对应的Lis集合
     */
    public static <T> List<T> getListData(String key, Class<T> cls) {
        List<T> list = new ArrayList<>();
        String json = mSharedPreferences.getString(key, "");
        if (!json.equals("") && json.length() > 0) {
            Gson gson = new Gson();
            JsonArray array = new JsonParser().parse(json).getAsJsonArray();
            for (JsonElement elem : array) {
                list.add(gson.fromJson(elem, cls));
            }
        }
        return list;
    }

    /**
     * 用于保存集合
     *
     * @param key key
     * @param map map数据
     * @return 保存结果
     */
    public static <K, V> boolean setHashMapData(String key, Map<K, V> map) {
        boolean result;
        SharedPreferences.Editor editor = mSharedPreferences.edit();
        try {
            Gson gson = new Gson();
            String json = gson.toJson(map);
            editor.putString(key, json);
            result = true;
        } catch (Exception e) {
            result = false;
            e.printStackTrace();
        }
        editor.apply();
        return result;
    }

    /**
     * 用于保存集合
     *
     * @param key key
     * @return HashMap
     */
    public static <V> HashMap<String, V> getHashMapData(String key, Class<V> clsV) {
        String json = mSharedPreferences.getString(key, "");
        HashMap<String, V> map = new HashMap<>();
        Gson gson = new Gson();
        JsonObject obj = new JsonParser().parse(json).getAsJsonObject();
        Set<Map.Entry<String, JsonElement>> entrySet = obj.entrySet();
        for (Map.Entry<String, JsonElement> entry : entrySet) {
            String entryKey = entry.getKey();
            JsonObject value = (JsonObject) entry.getValue();
            map.put(entryKey, gson.fromJson(value, clsV));
        }
        Log.e("SharedPreferencesUtil", obj.toString());
        return map;
    }


    public static void clear() {
        assert (mEditor != null);
        mEditor.clear().apply();
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值