博客
关于我
Android 轻量级存储方案的前世今生
阅读量:75 次
发布时间:2019-02-26

本文共 1371 字,大约阅读时间需要 4 分钟。

MMKV与SharedPreferences与DataStore的对比分析

在Android应用开发中,数据存储方案的选择至关重要。本文将从SharedPreferences、MMKV以及Jetpack DataStore的角度,分析它们的特点、优缺点及适用场景。

一、SharedPreferences

SharedPreferences是Android中最常用的轻量级数据存储方案,通过键值对形式存储数据。其本质是一个XML文件,文件路径位于/data/data/包名/shared_prefs。数据以XML格式存储,每次读取时需解析文件获取指定键的值。

1.1 内存占用问题SharedPreferences通过sSharedPrefsCache缓存所有SharedPreferences实例,导致已使用的SP实例始终驻留于内存中。大量数据存储可能导致内存占用过高。

1.2 线程安全通过锁机制保证线程安全,但在多进程场景下不可靠。

1.3 ANR风险在主线程等待子线程加载数据时,可能引发ANR问题。Android 8.0及以后版本优化后ANR风险显著降低。

二、MMKV

MMKV是腾讯开发的一款基于mmap内存映射的高性能键值组件,采用Protobuf序列化方式,性能稳定,支持多进程。

2.1 使用特点

  • 支持多进程访问,适合跨进程场景。
  • 数据实时写入,性能优于SharedPreferences。
  • 底层采用mmap技术,内存操作直接对应磁盘写入,减少IO等待。

2.2 核心优势

  • 跨进程支持:MMKV文件直接映射到各进程内存,避免数据同步问题。
  • 增量更新机制:支持对同一键值进行多次修改,仅最后一次生效。
  • Protobuf序列化:数据体积小,读写速度快。

三、DataStore

Jetpack DataStore是Android Jetpack的数据存储解决方案,支持键值对和类型化数据存储,基于Kotlin协程和Flow实现异步一致性事务。

3.1 功能对比

  • Preferences DataStore:键值对存储,与SharedPreferences类似,支持简单数据类型。
  • Proto DataStore:存储自定义数据类型,基于Protocol Buffers协议,类型安全。

3.2 优点

  • 异步操作支持:读写操作无需等待完成。
  • 数据一致性:基于Flow实现异步事务,保证数据一致性。
  • 可监听:支持对数据变化进行监听。

三、适用场景

  • SharedPreferences适合简单的键值对存储,注重快速读写。
  • MMKV适合多进程场景,需要实时写入的高性能存储。
  • DataStore适合复杂数据存储,需要一致性和异步操作的场景。

四、性能对比

  • 在单进程场景下,SharedPreferences读写速度较快,而MMKV在多进程场景下表现更优。
  • DataStore的读写速度约为SharedPreferences的两倍,Proto DataStore适合复杂对象存储。

五、总结

SharedPreferences、MMKV和DataStore各有优势。SharedPreferences简单易用,适合大部分场景;MMKV在跨进程和性能上更胜一筹;DataStore功能强大,支持异步和一致性操作。根据具体需求选择合适的方案。

转载地址:http://gar.baihongyu.com/

你可能感兴趣的文章
nullnullHuge Pages
查看>>
Numpy如何使用np.umprod重写range函数中i的python
查看>>
oauth2-shiro 添加 redis 实现版本
查看>>
OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
查看>>
OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
查看>>
OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
查看>>
object detection错误之Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
查看>>
Objective-C享元模式(Flyweight)
查看>>
Objective-C以递归的方式实现二叉搜索树算法(附完整源码)
查看>>
Objective-C实现1000 位斐波那契数算法(附完整源码)
查看>>
Objective-C实现2 个数字之间的算术几何平均值算法(附完整源码)
查看>>
Objective-C实现3n+1猜想(附完整源码)
查看>>
Objective-C实现A-Star算法(附完整源码)
查看>>
Objective-C实现all combinations所有组合算法(附完整源码)
查看>>
Objective-C实现An Armstrong number阿姆斯特朗数算法(附完整源码)
查看>>
Objective-C实现anagrams字谜算法(附完整源码)
查看>>
Objective-C实现ApproximationMonteCarlo蒙特卡洛方法计算pi值算法 (附完整源码)
查看>>
Objective-C实现area under curve曲线下面积算法(附完整源码)
查看>>
Objective-C实现armstrong numbers阿姆斯壮数算法(附完整源码)
查看>>
Objective-C实现atoi函数功能(附完整源码)
查看>>