概述
封装一个支持Java Bean,Java List,Java Map的SharedPreference。(2018.8.15更新)
实现
思路就是通过代理模式来实现对SharedPreference原有API的支持,同时利用Gson添加对Java Bean,Java List,Java Map的支持(需要提前引入Gson库)。
话不多说上代码:
package com.xiao.test;
import android.content.Context;
import android.content.SharedPreferences;
import com.google.gson.Gson;
import java.lang.reflect.Type;
import java.util.Set;
/**
* Created by zhangxiao on 2018/8/13 0013.
* 支持java的全部基本数据类型和Java Bean,Java List,Java Map的持久化和反持久化
*/
public class Sp {
private static SharedPreferences sSp;
private static SharedPreferences.Editor sEditor;
private static Gson sGson;
/**
* 初始化方法
*
* @param context
* @param fileName data\data\程序包名\shared_prefs目录下的自定义文件名
*/
public static void init(Context context, String fileName) {
sSp = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
sEditor = sSp.edit();
sGson = new Gson();
}
/**
* 初始化方法,data\data\程序包名\shared_prefs目录下的自定义文件名用缺省值"Sp"
*
* @param context
*/
public static void init(Context context) {
sSp = context.getSharedPreferences("Sp", Context.MODE_PRIVATE);
sEditor = sSp.edit();
sGson = new Gson();
}
/**
* 保存对象(兼容带泛型的对象)
* @param key
* @param t
* @param <T>
*/
public static <T> void put(String key, T t) {
sEditor.putString(key, sGson.toJson(t));
sEditor.apply();
}
//-------------------------------sharepreference自带API----------------------------//begin
public static void put(String key, int value) {
sEditor.putInt(key, value);
sEditor.apply();
}
public static void put(String key, long value) {
sEditor.putLong(key, value);
sEditor.apply();
}
public static void put(String key, float value) {
sEditor.putFloat(key, value);
sEditor.apply();
}
public static void put(String key, String value) {
sEditor.putString(key, value);
sEditor.apply();
}
public static void put(String key, boolean value) {
sEditor.putBoolean(key, value);
sEditor.apply();
}
public static void put(String key, Set<String> value) {
sEditor.putStringSet(key, value);
sEditor.apply();
}
public static int getInt(String key, int defValue) {
return sSp.getInt(key, defValue);
}
public static int getInt(String key) {
return sSp.getInt(key, 0);
}
public static long getLong(String key, long defValue) {
return sSp.getLong(key, defValue);
}
public static long getLong(String key) {
return sSp.getLong(key, 0L);
}
public static float getFloat(String key, float defValue) {
return sSp.getFloat(key, defValue);
}
public static float getFloat(String key) {
return sSp.getFloat(key, 0F);
}
public static String getString(String key, String defValue) {
return sSp.getString(key, defValue);
}
public static String getString(String key) {
return sSp.getString(key, "");
}
public static Boolean getBoolean(String key, boolean defValue) {
return sSp.getBoolean(key, defValue);
}
public static Boolean getBoolean(String key) {
return sSp.getBoolean(key, false);
}
public static Set getStringSet(String key, Set<String> defValue) {
return sSp.getStringSet(key, defValue);
}
public static Set getStringSet(String key) {
return sSp.getStringSet(key, null);
}
//-------------------------------sharepreference自带API----------------------------//end
/**
* 获取带泛型的对象
* @param key
* @param type
* @param <T>
* @return
* @throws Exception
*/
public static <T> T getGenericObj(String key, Type type) throws Exception {
String jsonString = getString(key);
if ("".equals(jsonString)){
throw new Exception("获取key对应的value失败,请检查是否提前有保存对应的值");
}
return sGson.fromJson(jsonString, type);
}
/**
* 获取不带泛型对象
* @param key
* @param classOfT
* @param <T>
* @return
* @throws Exception
*/
public static <T> T getObj(String key, Class<T> classOfT) throws Exception {
String jsonString = getString(key);
if ("".equals(jsonString)){
throw new Exception("获取key对应的value失败,请检查是否提前有保存对应的值");
}
return sGson.fromJson(jsonString, classOfT);
}
}
使用
使用超级简单,两步走:
1.复制粘贴上面的Sp.java到项目中。
2.新建一个Application的子类(不要忘记在Manifest里面注册),在oncreate()方法里调用Sp.init(Context context)。
接着就可以方便的用各种Sp.put和Sp.get进行保存和取值了。
package com.example.xiao.sharedperference;
import android.app.Application;
/**
* Created by xiao on 2017年7月22日,0022.
*/
public class App extends Application{
@Override
public void onCreate() {
super.onCreate();
Sp.init(this);
}
}
然后就可以直接使用了,看一下效果吧: