From 0fbfc76c9d703a979089249e4d186d5ab888537c Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Fri, 10 Apr 2020 16:11:20 +0800 Subject: [PATCH] Update SharedPreferences.md --- blogs/Android/SharedPreferences.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/blogs/Android/SharedPreferences.md b/blogs/Android/SharedPreferences.md index f252f2f..86edbaf 100644 --- a/blogs/Android/SharedPreferences.md +++ b/blogs/Android/SharedPreferences.md @@ -408,6 +408,22 @@ SharedPreferencesImpl#getXxx : 3. 不要使用 MODE_MULTI_PROCESS 4. 高频写操作的 key 与高频读操作的 key 可以适当的拆分文件,以减少同步锁竞争 5. 不要连续多次 edit,每次 edit 就是打开一次文件,应该获取一次 edit,然后多次执行 putXxx,减少内存波动,所以在封装方法的时候要注意了 +6. apply 在 QueueWork 维护的单线程池调用,虽然是异步的但是可能会阻塞 Service.onStop 和 Activity.onPause 方法,可能会导致 ANR + +ANR 容易发生的地方: + +1. sp.getXxx,首先会调用 awaitLoadedLocked 等待首次 sp 文件创建与读取操作完成 +2. sp.apply 虽然是异步的但是可能会在 Service Activity 等生命周期期间 mcr.writtenToDiskLatch.await() 等待过久 +3. sp.commit 最终会调用 sp.writeToFile 方法,很耗时 +4. ContextImpl.getSharedPreferences,主线程直接调用的话,如果 sp 文件很大处理时间也就会变成 + +#### 时序图 + +引自以下参考文章: + +![](https://i.loli.net/2020/04/10/P7LHhcNxCrUvuAq.png) + + #### 参考 @@ -415,3 +431,5 @@ SharedPreferencesImpl#getXxx : [浅析SharedPreferences](https://juejin.im/post/5bcbd780f265da0ad948056a) +[SharedPrederences 源码视角](https://xiaozhuanlan.com/topic/4509731862) +