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 方法略快。