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();
    }
}

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