android sharepreference 的替代品
在 Android 开发中,SharedPreferences 因简单易用被广泛用于轻量数据存储,但存在线程不安全、异步操作繁琐、不支持复杂数据结构等局限。以下是常见的替代品,按适用场景分类说明:
一、轻量级键值存储(替代基础功能)
1. DataStore(官方推荐)
- 类型:Google Jetpack 组件,分两种实现
Preferences DataStore:存储键值对(类似SharedPreferences,但 API 更现代)。Proto DataStore:基于 Protocol Buffers 存储结构化数据(类型安全,支持复杂结构)。
- 优势:
- 完全异步(基于协程和 Flow),避免
SharedPreferences的apply()/commit()潜在 ANR 风险。 - 线程安全,无需手动处理同步问题。
- 支持数据观察(Flow 监听变化),适合响应式 UI。
- 完全异步(基于协程和 Flow),避免
- 缺点:API 相对较新,需熟悉协程;
Preferences DataStore仍不支持类型安全(Proto DataStore支持)。 - 适用场景:替代
SharedPreferences的绝大多数场景,尤其是需要异步 / 响应式处理的场景。 - 示例(Preferences DataStore):
kotlin
// 定义 val dataStore: DataStore<Preferences> = context.createDataStore(name = "settings") // 存储 suspend fun saveUser(name: String) {dataStore.edit { settings ->settings[stringPreferencesKey("user_name")] = name} } // 读取(Flow 监听) val userNameFlow: Flow<String?> = dataStore.data.map { it[stringPreferencesKey("user_name")] }
2. MMKV(腾讯开源)
- 特点:基于 mmap 内存映射的高性能键值存储,支持多进程。
- 优势:
- 读写速度远超
SharedPreferences(内存映射避免频繁 IO)。 - 支持更多数据类型(布尔、int、long、float、double、String、字节数组等)。
- 自动加密(可选),线程安全,API 简单(类似
SharedPreferences)。
- 读写速度远超
- 缺点:非官方组件,依赖第三方库;复杂结构需手动序列化(如 JSON)。
- 适用场景:对性能要求高、需要多进程访问、存储简单数据的场景(如配置、缓存)。
- 示例:
kotlin
// 初始化 MMKV.initialize(context) val mmkv = MMKV.defaultMMKV() // 存储 mmkv.encode("user_name", "张三") // 读取 val name = mmkv.decodeString("user_name")
