关于Android键值对存储的方案选择
我尽量不打错别字,用词准确,不造成阅读障碍。
关于Android键值对方案的选择一般只有三种:MMKV、SharedPreferences、DataStore,其它的我也不知道了。
一、SharedPreferences
优点
- 使用简单:Android SDK中自带的键值对存储方式,其不需要添加任何多余的依赖,直接使用即可。
- 不丢失数据:因为其在写入数据的时候会做数据备份,所以如果因为停电等不可抗因素导致的数据损坏并不会导致数据丢失。
缺点
- 不支持多进程。
- 初始化时会卡顿:当数据量很大的时候初始化会卡顿,而且百分百卡顿。另外,这个异常会上传到后台的统计数据里,会影响绩效。
- 可能导致卡顿甚至ANR:虽然其支持异步方式保存更改,但是Activity会在启动和销毁的时候等待这些异步任务的完成,这是为了保证数据一致性而做的妥协,这种情况下,异步就变为同步了,属于是低概率事件。
二、DataStore
2020年推出,2021年8月才发布正式版,为了替换SharedPreferences而出。
优点
- 不丢失数据:因为其在写入数据的时候会做数据备份,所以如果因为停电等不可抗因素导致的数据损坏并不会导致数据丢失,这点和SharedPreferences一样。
- 协程操作:在初始化及其它使用场景下完全不会有卡顿。
- 方便的回调写法:出来的比较晚,语法比较新,再加上Kotlind的语法支持,所以写起来比较舒服。
- 大数据量读写速度很快,是所有方案中最快的。
缺点
- 不支持多进程:新版本已经有支持的代码,现在也许支持了。
- 小数据量读写速度不快,甚至没有SharedPreferences快,是所有方案中最慢的。
- 需要Kotlin支持:因为是用协程操作的。
三、MMKV
Tencent在2018年推出,起初是因为微信部分用户在解析特殊字符的时候会发生崩溃,所以微信想要在显示消息之前将文本保存至磁盘,为了在崩溃之前准确拿到数据,所以要同步保存(异步的话可能数据还没保存完,程序就完蛋了或者数据损坏),但是同步保存容易导致主线程卡顿,尤其是群里有大量消息来临的时候,总结来说就是有高频同步写磁盘的需求。最后微信采用了内存映射的方案,通过mmap内存映射文件(这种方式下,写入内存的数据也会自动写入文件),提供一段可供随时写入的内存块,由操作系统将内存写入文件,速度快且不必担心Crash导致的数据丢失。
优点
- 支持多进程。
- 不影响绩效:数据丢失异常不会被后台检查到。
- 少量及中量数据写入速度很快,是所有方案中最快的。
缺点
- 大数据速度慢:因为是自行管理一块独立的内存,所以在内存尺度的伸缩上就是比较受限,导致写入大数据时速度很慢。
- 丢数据:因为不备份,如果备份了,那就要写入磁盘,就会导致没有了高频写入的优势,与需求相违背。
- 有概率卡顿:初始化的时候会把所有文件都读出来,所以有概率卡顿。
总结
一般情况下,对数据丢失不敏感,数据量也不大的情况下,建议使用MMKV就好,如果对多进程有要求,那只有MMKV或看看DataStore的最新版是否支持。大数据量的话建议DataStore,速度很快,也很稳,或者对数据保存时间没有特别要求的情况下,使用DataStore。基本无要求的情况下,可以使用SharedPreferences,但是谁也不能保证后面会不会数据量增大,再加上卡顿可能的发生,其实不如用DataStore。