文章目录
Android MMKV
概述
MMKV 是腾讯开源的高性能、轻量级 Key-Value 存储框架,基于 mmap 内存映射与Protobuf 编码。
替代 SharedPreferences,适用于高频读写、多进程共享、敏感数据缓存等场景。
SP问题
- ANR风险
- 整体加载
- 全量写入
- 多线程不安全
MMKV优点
- 基于mmap内存映射
- 将磁盘文件直接映射到进程虚拟内存,读写内存即读写文件,性能远高于IO操作。
- Protobuf序列化
- Protobuf序列化体积小、解析快,比XML/JSON更紧凑。
- 增量追加写入
- 每次更新仅追加新数据到文件末尾,不是全量写入。
- 文件空间不足是自动扩容,并促发文件整理,清理过期数据。
- 多线程安全
添加依赖
implementation 'com.tencent:mmkv:2.4.0'
使用
初始化
kotlin
class BaseApp : Application() {
override fun onCreate() {
super.onCreate()
val rootDir = MMKV.initialize(this)
Log.e("TAG", "rootDir: ${rootDir}") // /data/user/0/com.example.test/files/mmkv
}
}
增改数据
kotlin
val mmkv = MMKV.defaultMMKV()
MMKV userKv=MMKV.mmkvWithID("user_info"); // 命名空间隔离
mmkv.encode("name", "小明")
mmkv.encode("age", 18)
mmkv.encode("sex", true)
val address = listOf("河北省", "石家庄市")
mmkv.encode("address", Gson().toJson(address))
val hobbies = setOf("篮球", "足球")
mmkv.encode("hobbies", hobbies)
val user = User("小白", 18, true)
mmkv.encode("user", user)
读取数据
kotlin
val name = mmkv.decodeString("name")
val age = mmkv.decodeInt("age")
val sex = mmkv.decodeBool("sex")
val addressJson = mmkv.decodeString("address")
val address = Gson().fromJson(addressJson, Array<String>::class.java)
val hobbiesSet = mmkv.decodeStringSet("hobbies")
val user = mmkv.decodeParcelable<User>("user", User::class.java)
删除数据
kotlin
// 删单个
kv.removeValueForKey("name");
// 清空全部
kv.clearAll();
MMKV与DataStore对比
- MMKV:
- mmap内存映射
- Protobuf编码
- 增量追加写入
- 零拷贝、极快
- DataStore
- 基于文件IO
- 全量写入
- 使用ProtoBuf格式存储
- 依靠协程调度