我们知道 SharedPreferences 会从文件读取 xml 文件, 并将其以 getXxx
/putXxx
的形式提供读写服务. 其中涉及到如下几个问题:
getXxx
如何从内存中获取配置synchronized
关键字保障getSharedPreferences
会读取磁盘文件, 后续的 getSharedPreferences
会从内存缓存中获取. 如果第一次调用 getSharedPreferences
时还没从磁盘加载完毕就调用 getXxx/putXxx
, 则 getXxx/putXxx
操作会卡主, 直到数据从磁盘加载完毕后返回apply
是同步回写内存, 然后把异步回写磁盘的任务放到一个单线程的队列中等待调度. commit
和前者一样, 只不过要等待异步磁盘任务结束后才返回MODE_MULTI_PROCESS
是在每次 getSharedPreferences
时检查磁盘上配置文件上次修改时间和文件大小, 一旦所有修改则会重新从磁盘加载文件. 所以并不能保证多进程数据的实时同步MODE_WORLD_READABLE
& MODE_WORLD_WRITEABLE
. 一旦指定, 会抛异常MODE_MULTI_PROCESS
. 这个标记就像 MODE_WORLD_READABLE
/MODE_WORLD_WRITEABLE
未来会被废弃apply
/ commit
都会把全部的数据一次性写入磁盘, 所以单个的配置文件不应该过大, 影响整体性能现在我们从源码入手, 彻底搞懂 SharedPreferences 有关的所有问题. 本文并不是入门教程, 主要面向有 SharedPreferences 基础的同学