SP缓存Android应用数据:巧用commit()和apply()
2023-12-02 15:16:55
Android 中高效利用 SharedPreferences 存储数据
简介
在 Android 开发中,SharedPreferences 是一种轻量级、键值对数据存储系统,专用于存储应用首选项、用户设置和非敏感数据。它提供了简单而高效的方式来持久化数据,而无需创建和管理数据库或文件。
创建和获取 SharedPreferences 对象
要使用 SharedPreferences,首先需要创建一个 SharedPreferences 对象 。通过调用 getSharedPreferences()
方法并提供 SP 名称和访问模式来完成此操作。SP 名称是一个字符串,用于识别 SP。模式是一个整数,用于指定 SP 的访问权限。
val sharedPreferences = getSharedPreferences("MySharedPreferences", Context.MODE_PRIVATE)
写入数据
使用 put()
方法将数据写入 SP。该方法接受两个参数:键(用于标识数据)和值(要存储的数据)。
sharedPreferences.edit().putString("username", "John Doe").commit()
读取数据
使用 get()
方法从 SP 中获取数据。该方法接受两个参数:键和默认值(如果键不存在时返回的值)。
val username = sharedPreferences.getString("username", "Unknown")
删除数据
使用 remove()
方法从 SP 中删除数据。该方法需要一个参数:键。
sharedPreferences.remove("username")
线程安全写入
在工作线程中写入 SP 时,直接调用 commit()
方法。这会立即将数据写入 SP 文件。
在主线程中写入 SP 时,请勿调用 commit()
方法。相反,请调用 apply()
方法。apply()
方法不会立即将数据写入 SP 文件,而是将其放入队列,由后台线程稍后写入。这可以防止主线程阻塞,导致应用界面卡顿。
sharedPreferences.edit().putString("username", "John Doe").apply()
优点
- 简单易用: 无需创建和管理数据库或文件。
- 高效: 比数据库或文件读取/写入速度更快。
- 线程安全:
commit()
和apply()
方法确保线程安全写入。 - 数据持久化: 即使应用关闭,数据也会保留。
局限性
- 容量限制: 每个 SP 文件的大小限制为 1MB。
- 数据类型限制: 仅支持基本数据类型(字符串、整数、布尔值等)。
- 安全性: 默认情况下,SP 数据存储在设备上,可能会被其他应用访问。
常见问题解答
1. 什么时候应该使用 SharedPreferences?
在需要存储少量非敏感数据时,例如用户设置、首选项和缓存数据。
2. 如何提高 SharedPreferences 的性能?
- 使用
apply()
方法在主线程中写入数据。 - 避免在 SP 中存储大量数据。
- 使用加密来保护敏感数据。
3. 如何从 SharedPreferences 中删除所有数据?
使用 clear()
方法从 SP 中删除所有数据。
sharedPreferences.edit().clear().apply()
4. 如何检查 SP 中是否存在特定键?
使用 contains()
方法检查 SP 中是否存在特定键。
if (sharedPreferences.contains("username")) {
// 键存在
}
5. 如何监听 SharedPreferences 的更改?
使用 registerOnSharedPreferenceChangeListener()
方法监听 SP 的更改。
sharedPreferences.registerOnSharedPreferenceChangeListener(
object : SharedPreferences.OnSharedPreferenceChangeListener {
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
// SP 发生更改
}
}
)