返回

SP缓存Android应用数据:巧用commit()和apply()

Android

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 发生更改
        }
    }
)