DataStore

6 阅读3分钟

1、DataStore 是什么?

答案DataStore 是 Jetpack 官方推出,用来替代 SharedPreferences 的异步键值存储框架;基于 Kotlin 协程 + Flow 实现,异步非阻塞、线程安全、支持响应式观察、兼容 MVVM,官方推荐替代 SP。

2、DataStore 两种类型

答案

  1. Preferences DataStore类似 SP,key-value 键值对,不用定义实体类,适合存简单配置。
  2. Proto DataStore基于 Protocol Buffers,需要定义 proto 实体,适合存结构化对象、复杂数据,类型安全。

3、DataStore 核心特点

答案

  1. 全程异步、非阻塞,不卡主线程、无 ANR 风险
  2. 基于 Flow,可以响应式监听数据变化
  3. 线程安全、内部自带同步机制
  4. 配置变更自动回调,适合 MVVM 订阅状态
  5. 支持事务、数据一致性更好
  6. 不一次性全量加载,内存占用更低

4、DataStore 相比 SharedPreferences 优势

答案

  1. SP 同步阻塞易卡顿 ANR,DataStore 全异步协程,不阻塞
  2. SP 无法精准监听单个 key 变化;DataStore Flow 可订阅实时变更
  3. SP 全量加载大文件卡顿;DataStore 按需读取,内存更优
  4. 天然线程安全,不用自己加锁
  5. 完美适配 Kotlin、协程、Flow、MVVM 架构
  6. 支持数据迁移、兼容旧 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 有缺点吗?

答案

  1. 必须用 Kotlin + 协程,Java 用起来麻烦
  2. 没有 MMKV 读写速度快
  3. 不原生支持多进程(需要自己处理)
  4. 语法比 SP、MMKV 稍繁琐

10、DataStore 和 SP、MMKV 三者对比

答案

  • SP:XML、同步阻塞、易卡顿、不支持响应式、多进程坑多,逐步淘汰
  • DataStore:官方异步、Flow 响应式、适配 MVVM/Compose,适合规范架构
  • MMKV:mmap 内存映射、性能最强、支持多进程、简单好用,适合追求性能和稳定

11、MVVM 中怎么用 DataStore

答案

  1. DataStore 封装在 Repository 层
  2. ViewModel 通过协程调用 Repository 读写
  3. 利用 Flow 订阅数据变化,转 State 给 View
  4. View 只观察状态,不直接操作存储,完全符合单向数据流

12、面试一句话总结

DataStore 是 Jetpack 官方替代 SP 的异步存储,基于协程 + Flow,全异步非阻塞不卡顿,支持响应式监听数据变化、线程安全、适配 MVVM 和 Compose;相比 SP 解决了同步阻塞、全量加载、无法精准监听的问题;性能略低于 MMKV,但架构更规范,适合新项目规范开发。