1 getValue的时候可能导致线程阻塞或ANR
在我们的SharedPreferencesImpl的构造函数里,会启动一个子线程去加载磁盘文件,把xml文件转换成map对象,如果文件很大或者线程调度没有马上去启动这个线程的话,那么加载这个操作需要一段时间才能执行完成。
而假如我们刚好初始化的时候后马上去getLong(String key, long defValue)或者
getFloat(String key, float defValue),getBoolean(String key, boolean defValue)等等
它们这些获取值的方法有个awaitLoadedLocked();方法来校验是否需要阻塞外部线程的
目的就是确保取值操作前一定是执行完成了文件(xml)转换成内存map的转换成功,最后在磁盘加载完成时才会notifyAll操作,把我们外部读取value的线程给唤醒。
上述的操作在我们复杂的APP复杂场景下会经常出现的,磁盘加载并阻塞外部获取值的时间会比较长,引起anr。
网友评论