项目中如何实现一键快速切换sp到mmkv

95 篇文章 0 订阅

最近看到很多博客都在分享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方法里面我不用去修改业务逻辑代码,基本需求满足了。

源码地址:https://github.com/zhudaihao/SaveData

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值