Android SharedPreferences的單例模式(一)

放一個SP工具類,後期參考用。

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

import com.guangsu.messenger.MyApplication;

import java.util.HashMap;

/**
 * SharedPreferences的單例模式,支持不同的命名
 * 作者:Geofferysun
 * 參考:https://juejin.im/post/5b7982b351882542c11b0da3
 */
public class SPSingleton {
    private static final String DEFAULT = "default";
    private static volatile HashMap<String, SPSingleton> instanceMap = new HashMap<>();
    private SharedPreferences sp;
    private SharedPreferences.Editor editor;
    //是否是執行apply的模式,false表示爲commit保存數據
    private boolean isApplyMode = false;

    private SPSingleton(String name) {
        if (DEFAULT.equals(name)) {
            sp = PreferenceManager.getDefaultSharedPreferences(MyApplication.getInstance());
        } else {
            sp = MyApplication.getInstance().getSharedPreferences(name, Context.MODE_PRIVATE);
        }
        editor = sp.edit();
    }

    public static SPSingleton pre() {
        return pre(DEFAULT);
    }

    public static SPSingleton pre(String name) {
        if (instanceMap.get(name) == null) {
            synchronized (SPSingleton.class) {
                if (instanceMap.get(name) == null) {
                    instanceMap.put(name, new SPSingleton(name));
                }
            }
        }
        //這裏每次get操作時強制將保存模式改爲commit的方式
        instanceMap.get(name).isApplyMode = false;
        return instanceMap.get(name);
    }

    // 如果用apply模式的話,得要先調用這個方法,
    // 然後鏈式調用後續的存儲方法,最後以commit方法結尾
    private SPSingleton applyMode() {
        isApplyMode = true;
        return this;
    }

    private void commit() {
        editor.commit();
    }

    /**
     * 保存數據的方法,我們需要拿到保存數據的具體類型,然後根據類型調用不同的保存方法
     *
     * @param key
     * @param object
     * @return
     */
    public SPSingleton put(String key, Object object) {
        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 {
            if (object != null) {
                editor.putString(key, object.toString());
            } else {
                editor.putString(key, "");
            }
        }

        save();
        return this;
    }

    /**
     * 得到保存數據的方法,我們根據默認值得到保存的數據的具體類型,然後調用相對於的方法獲取值
     *
     * @param key
     * @param defaultObject
     * @return
     */
    public Object get(String key, Object defaultObject) {
        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;
    }

    public void delete(String key) {
        editor.remove(key);
        save();
    }

    private void save() {
        if (isApplyMode) {
            editor.apply();
        } else {
            editor.commit();
        }
    }

    // 測試用法
    public static void main(String[] args) {
        //保存Sting
        SPSingleton.pre().put("stringParam", "保存的是String");
        //保存整數
        SPSingleton.pre().put("IntValue", 1);
        //這個會保存到文件名爲"Other"的xml文件中
        SPSingleton.pre("other").put("BoolValue", false);
        //這會調用apply的模式保存
        SPSingleton.pre().applyMode().put("", 1).put("", "").put("", 12).commit();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章