整体架构
初始化的时候会加载整个XML到内存中
作为内存缓存
这也是不能跨进程的原因,任何东西只要做缓存那就是2套数据了,即使SP做了多进程措施也无济于事
- 取:从内存取
- commit:直接同步执行
- apply:入队
引起ANR的原因
取是不会有ANR的,只需要在最初加载文件的时候读取一次即可,后续都是从内存去取
commit直接在当前线程执行,虽说SP是轻量级的IO,但是至少也是IO操作,做个最简单的IO操作,也要几百ms
apply入队本是对此很不错的优化,但是最坑的一点是,Activity、Service、Broadcast都会在某些条件下等待SP队列全部执行完成
Google美名其曰确保IO可以顺利执行
可以参考Activity ANR的堆栈
waitToFinish方法会加锁,等待queue清空
public static void waitToFinish() {
long startTime = System.currentTimeMillis();
boolean hadMessages = false;
Handler handler