当前位置: 代码迷 >> 综合 >> SharedPreferences 优化
  详细解决方案

SharedPreferences 优化

热度:111   发布时间:2023-10-18 17:35:36.0

SharedPreferences 是一种简单便捷的存储方式,在 Android 应用中,常用来存储一些简单配置信息,例如保存应用中的一个开关状态和一些数据的独家属性等.

  • 特点

用 Map 数据结构来存储数据,以键值(Key-Value)的方式存储,可以简单地读取与写入;数据读取与写入的方法都非常简单。

  • 存储路径

SharedPreferences 将数据保存到一个 XML 文件中,该文件位于/data/data/PackageName/shares_prefs 下。

  • 创建模式
  • Activity.MODE_APPEND:如果该文件已经存在,就将数据写入,而不是抹掉现有文件
    的末尾。
  • Activity.MODE_PRIVATE:默认模式,只能由创建该文件的应用程序调用,即为私有的。
  • Activity.MODE_WORLD_READABLE:允许所有其他应用程序读取和创建文件的权限。
  • Activity.MODE_WORLD_WRITEABLE:允许所有其他应用程序具有写入、访问和创建的文件权限。

SharedPreferences 的最大优点就是使用简单,速度也快,是一些配置数据的首选存储方式。比如创建一个私有的 SharedPreferences,如下代码就可以实现 SharedPrefenrences 的创建与读写功能。

		SharedPreferences sp = context.getSharedPreferences("fileName", Context.MODE_PRIVATE);SharedPreferences.Editor editor = sp.edit();// 存储editor.putString("key","value");// 提交editor.commit();// 读取sp.getString("key",null);

SharedPreferences 实际上是对一个 XML 文件存储 key-value 键值对,每一次的 commit和 apply 操作都是一次 I/O 写操作。众所周知,I/O 操作是最慢的操作之一,在主线程中操作会导致主线程缓慢。SharedPreferences 性能优化主要是两个方面:

  • IO 性能。
  • 同步锁问题。

IO 性能瓶颈是导致 SharedPreferences 性能差最大的原因,SharedPreferences 上的 IO 分为读取数据到内存与数据写入磁盘两种情况。

  • 当 SharedPreferences 文件还没有被加载到内存时,调用 getSharedPreferences 方法会初始化文件并读入内存,这容易导致耗时更长。
  • Editor 的 commit 或者 apply 方法每次执行时,同步写入磁盘耗时较长。

需要说明的是,editor 的 commit 和 apply 方法的区别在于同步写入和异步写入,以及是否需要返回值。在不需要返回值的情况下,使用 apply 方法可以极大提高性能。

另一方面就是同步锁的问题,Put()和 getEditor()方法会锁定 Editor 对象,在写入磁盘时更会锁定一个写入锁。

因此,最好的优化方法就是避免频繁地读写 SharedPreferences,减少无谓的调用,如下伪代码在同一生命周期内,SharedPreferences 读一次即可。

if(开关未读取过&没有发生过变化){........
}

而对于 SharedPreferences 的批量操作,最好先获取一个 editor,进行批量操作,然后调用 apply 方法。这样会比 commit 方法略快。

  相关解决方案