最近看到很多博客都在分享sp的前世今生问题,或者说mmkv性能的优越,很少有介绍,在实际开发中实现一键快速切换sp到mmkv或者后面谷歌推出的DataStore;
今天希望实现一键快速切换sp到mmkv或者DataStore;
需求:希望在业务代码使用后,后期替换新的框架就不修改业务逻辑代码,只需要配置下就可以切换我需要的框架。
实现思路:我们可以考虑使用静态代理模式实现需要。
1:定义个顶层接口,接口里面定义抽象方法
2:再定义个实现类,实现接口里面的方法
3:再定义个代理类,代理类也实现接口,同时代理类持有顶层接口对象,
定义个初始化顶层接口实例的方法把外接口实例赋值给持有的顶层接口对象,
代理通过持有的顶层接口对象去实现对应接口方法。
代码实现:
1:顶层接口部分代码
//MMKV实现类的部分代码
public interface Save {
void encode(String key, boolean value);
void encode(String key, int value);
void encode(String key, long value);
void encode(String key, float value);
void encode(String key, double value);
void encode(String key, String value);
。。。。。。。。。。。
}
2:实现类部分代码
public class MMKVSave implements Save {
public MMKVSave(Context context) {
Context mContext;
if (context instanceof Activity) {
mContext = context.getApplicationContext();
} else {
mContext = context;
}
MMKV.initialize(mContext);
}
@Override
public void encode(String key, boolean value) {
MMKV.defaultMMKV().encode(key, value);
}
@Override
public void encode(String key, String value) {
MMKV.defaultMMKV().encode(key, value);
}
@Override
public void encode(String key, Set value) {
MMKV.defaultMMKV().encode(key, value);
}
/**
* 保存值
*
* @param key
* @param value
*/
@Override
public void encode(String key, byte[] value) {
MMKV.defaultMMKV().encode(key, value);
}
。。。。。。。。。。。
}
//sp部分实现的代码
public class SPSave implements Save {
private SharedPreferences sharedPreferences;
private SharedPreferences.Editor editor;
public SPSave(Context context) {
sharedPreferences = context.getSharedPreferences("name", Context.MODE_PRIVATE);
editor = sharedPreferences.edit();
}
@Override
public void encode(String key, boolean value) {
editor = sharedPreferences.edit();
editor.putBoolean(key, value);
editor.apply();
}
@Override
public void encode(String key, String value) {
editor = sharedPreferences.edit();
editor.putString(key, value);
editor.apply();
}
@Override
public void encode(String key, int value) {
editor = sharedPreferences.edit();
editor.putInt(key, value);
editor.apply();
}
。。。。。。。。。。。。
}
3:代理部分代码
public class DataSaveUtils implements Save {
private static volatile DataSaveUtils mDataSaveUtils;
private Save mSave;
private DataSaveUtils() {
}
//获取实例对象
public static DataSaveUtils getInstance() {
if (mDataSaveUtils == null) {
synchronized (DataSaveUtils.class) {
if (mDataSaveUtils == null) {
mDataSaveUtils = new DataSaveUtils();
}
}
}
return mDataSaveUtils;
}
//初始化 save
public void initSave(Save save) {
mSave = save;
}
/**
* 保存值
*
* @param key
* @param value
*/
@Override
public void encode(String key, boolean value) {
if (mSave != null) {
mSave.encode(key, value);
}
}
。。。。。。。。。。。。。。。。。。。。
}
使用代码:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "zdh";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化配置饿 实现一键切换
// DataSaveUtils.getInstance().initSave(new MMKVSave(getApplicationContext()));
DataSaveUtils.getInstance().initSave(new SPSave(getApplicationContext()));
}
public void set(View view) {
DataSaveUtils.getInstance().encode("tag1", false);讹误
DataSaveUtils.getInstance().encode("tag2", "测试");
DataSaveUtils.getInstance().encode("tag3", 100);
Set<String> list = new HashSet<>();
list.add("张三");
DataSaveUtils.getInstance().encode("tag4", list);
}
public void get(View view) {
Log.e(TAG, "-------- " + DataSaveUtils.getInstance().decodeBool("tag1"));
Log.e(TAG, "-------- " + DataSaveUtils.getInstance().decodeString("tag2"));
Log.e(TAG, "-------- " + DataSaveUtils.getInstance().decodeInt("tag3"));
Log.e(TAG, "-------- " + DataSaveUtils.getInstance().decodeStringSet("tag4"));
}
}
测试结果:切换sp到mmkv只需要在oncreat初始化配置下就可以实现一键切换(实现项目可以在application初始化),并且set和get方法里面我不用去修改业务逻辑代码,基本需求满足了。