1、DataStore 是什么?
答案DataStore 是 Jetpack 官方推出,用来替代 SharedPreferences 的异步键值存储框架;基于 Kotlin 协程 + Flow 实现,异步非阻塞、线程安全、支持响应式观察、兼容 MVVM,官方推荐替代 SP。
2、DataStore 两种类型
答案
- Preferences DataStore类似 SP,key-value 键值对,不用定义实体类,适合存简单配置。
- Proto DataStore基于 Protocol Buffers,需要定义 proto 实体,适合存结构化对象、复杂数据,类型安全。
3、DataStore 核心特点
答案
- 全程异步、非阻塞,不卡主线程、无 ANR 风险
- 基于 Flow,可以响应式监听数据变化
- 线程安全、内部自带同步机制
- 配置变更自动回调,适合 MVVM 订阅状态
- 支持事务、数据一致性更好
- 不一次性全量加载,内存占用更低
4、DataStore 相比 SharedPreferences 优势
答案
- SP 同步阻塞易卡顿 ANR,DataStore 全异步协程,不阻塞
- SP 无法精准监听单个 key 变化;DataStore Flow 可订阅实时变更
- SP 全量加载大文件卡顿;DataStore 按需读取,内存更优
- 天然线程安全,不用自己加锁
- 完美适配 Kotlin、协程、Flow、MVVM 架构
- 支持数据迁移、兼容旧 SP 数据
5、DataStore 底层原理简单说
答案底层用文件持久化 + 协程 + Flow:
- 数据以二进制写入本地文件
- 读写全部放在 Dispatchers.IO 子线程异步执行
- 用 Flow 发射数据,外部可以持续订阅、自动感知变化
- 内部做了版本兼容、数据迁移、线程安全处理
6、DataStore 怎么监听数据变化
答案通过 Flow 订阅:DataStore 数据会以 Flow 流持续发射,在 ViewModel 里 collectAsState 转成 UI 状态,数据一改,UI 自动重组刷新,天然适配 Compose / MVVM。
7、DataStore 是同步还是异步?
答案****全异步,所有读写操作都挂起函数 suspend,必须在协程、launch、viewModelScope 中调用,不阻塞主线程,不会引发 ANR。
8、DataStore 能不能替代 MMKV?
答案
- 简单配置、响应式监听、官方架构适配:优先 DataStore
- 追求极致读写性能、多进程、超大并发:还是 MMKV 更强项目选型:架构规范用 DataStore;高性能、多进程场景用 MMKV。
9、DataStore 有缺点吗?
答案
- 必须用 Kotlin + 协程,Java 用起来麻烦
- 没有 MMKV 读写速度快
- 不原生支持多进程(需要自己处理)
- 语法比 SP、MMKV 稍繁琐
10、DataStore 和 SP、MMKV 三者对比
答案
- SP:XML、同步阻塞、易卡顿、不支持响应式、多进程坑多,逐步淘汰
- DataStore:官方异步、Flow 响应式、适配 MVVM/Compose,适合规范架构
- MMKV:mmap 内存映射、性能最强、支持多进程、简单好用,适合追求性能和稳定
11、MVVM 中怎么用 DataStore
答案
- DataStore 封装在 Repository 层
- ViewModel 通过协程调用 Repository 读写
- 利用 Flow 订阅数据变化,转 State 给 View
- View 只观察状态,不直接操作存储,完全符合单向数据流
12、面试一句话总结
DataStore 是 Jetpack 官方替代 SP 的异步存储,基于协程 + Flow,全异步非阻塞不卡顿,支持响应式监听数据变化、线程安全、适配 MVVM 和 Compose;相比 SP 解决了同步阻塞、全量加载、无法精准监听的问题;性能略低于 MMKV,但架构更规范,适合新项目规范开发。