Android MMKV

1.MMKV

对于经常使用的快速本地化存储,Android中往往会选择SharedPreferences来作为存储方式。SharePreferences作为Android库中自带的存储方式,在使用方式上很便捷,但是往往存在以下一些问题。

①线程阻塞:通过getSharedPreferences可以获取SP实例,从首次初始化到读到数据会存在延迟,因为读文件的操作阻塞调用的线程 直到文件读取完毕。如果在主线程调用可能会对UI流畅度造成影响。

②文件跨进程共享问题:SharedPreferences虽然支持设置MODE_MULTI_PROCESS标志位,但是跨进程共享SP存在很多问题,所以不建议使用该模式。

③二次写入:将数据写入文件需要将数据拷贝两次再写入到文件中,如果数据量过大,也会有很大的性能损耗。

MMKV解决了SharedPreferences的以上问题,MMKV是基于mmap内存映射的移动端通用key-value组件,相对于SP而言,MMKV无论是在速度上还是在文件大小上都更具有优势,是一个很方便易用的框架。

MMKV存储支持以下Java语言基础类型:boolean、int、long、float、double、byte[]、String、Set<String>、任何实现了Parcelable的类型。MMKV中对象存储方式是转化成json串,通过字符串存储,使用的时候再取出来反序列化。

MMKV存储的优势:

①非常高效:MMKV使用mmap与文件保持内存同步,由操作系统负责将内存回写到文件,不必担心crash导致数据丢失。使用protobuf对数值进行编码/解码,充分利用Android,实现最佳性能。

②多进程并发:MMKV支持进程之间的并发读写访问。

③易于使用:可以随时使用MMKV。所有的更改都会立即保存,不需要同步,也不需要apply调用。

④少数几个文件(小):MMKV包含进程锁、编码/解码帮助程序和mmap逻辑等,很整洁。

MMMKV无论是在写入性能还是在读取性能,都远远超越SharedPreferences和SQLite,尤其是在Android多进程key-value存储组件上MMKV是不二之选。

2.MMKV使用方法

①引入依赖

在build.gradle文件中加入

implementation 'com.tencent:mmkv-static:1.2.10'

②在Application中初始化

MMKV.initialize(this);

MMKV 默认把文件存放在$(FilesDir)/mmkv/目录。也可以在 MMKV初始化时自定义根目录:

String dir = getFilesDir().getAbsolutePath() + "/mmkv";

String rootDir = MMKV.initialize(dir);

③MMKV对象获取

MMKV提供一个全局的实例,可以直接使用。

//1. 获取默认全局实例 (一般就使用这个就行)

MMKV kv = MMKV.defaultMMKV();

//2. 也可以自定义MMKV对象,设置自定ID (根据业务区分的存取实例)

MMKV kv = MMKV.mmkvWithID("ID");

//3. MMKV默认是支持单进程的,如果业务需要多进程访问,需要在初始化的时候添加多进程模式参数

MMKV kv = MMKV.mmkvWithID("ID", MMKV.MULTI_PROCESS_MODE); //多进程同步支持

④存取方法

添加/更新数据:

kv.encode("bool", true); //存boolean

kv.encode("int", Integer.MIN_VALUE); //存int

kv.encode("string", "MyiSMMKV"); //存string

获取数据:

boolean bValue = kv.decodeBool("bool"); //获取boolean

int iValue = kv.decodeInt("int"); //获取int

String str = kv.decodeString("string"); //获取string

删除数据:

mmkv.removeValueForKey(key);

如果需要存取对象,可以用存取对象json字符串的方法,将对象转成json存,取出json转回对象。

3.SharedPreferences迁移

MMKV提供了importFromSharedPreferences()方法进行SP的数据迁移。

MMKV还额外实现了SharedPreferences、SharedPreferences.Editor这两个接口,在迁移的时候只需两三行代码即可,其他CRUD操作代码都不用改。

MMKV kv = MMKV.mmkvWithID("myData");

SharedPreferences olderData = App.getInstance().getSharedPreferences("myData", MODE_PRIVATE);

kv.importFromSharedPreferences(olderData);

olderData.edit().clear().apply();

猜你喜欢

转载自blog.csdn.net/zenmela2011/article/details/130808428