这篇文章主要介绍“SharedPreference引发ANR原理是什么”,在日常操作中,相信很多人在SharedPreference引发ANR原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SharedPreference引发ANR原理是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!日常开发中,使用过SharedPreference
的同学,肯定在监控平台上看到过和SharedPreference
相关的ANR,而且量应该不小。如果使用比较多或者经常用sp存一些大数据,如json等,相关的ANR经常能排到前10。下面就从源码的角度来看看,为什么SharedPreference
容易产生ANR。SharedPreference
的用法,相信做过Android开发的同学都会,所以这里就只简单介绍一下,不详细介绍了。SharedPreference
的相关方法,除了commit
外,一般的开发同学都会直接在主线程调用,认为这样不耗时。但其实,SharedPreference
的很多方法都是耗时的,直接在主线程调很可能会引起ANR的问题。另外,虽然apply
方法的调用不耗时,但是会引起生命周期相关的ANR问题。下面就来从源码的角度,看一下可能引起ANR的问题所在。getSharedPreference(String name, int mode)下面看下获取文件路径的方法:getSharedPreferencesPath()
,这个方法可能存在耗时。调用getPreferencesDir()
获取sharedPrefs
的根路径ensurePrivateDirExists()
:确保文件目录存在再来看看getSharedPreferences
生成SharedPreferenceImpl
对象的流程。先来看下cache的原理再来看看SharedPreferenceImpl
的构造方法,看看SharedPreference
是怎么初始化的。startLoadFromDisk()
:开启一个子线程,将sp中的内容读取到内存中loadFromDisk
:真正读取文件的地方总结:经过上面的分析,getSharedPreferences
主要的卡顿点在于,获取PreferencesDir
的时候,可能存在目录尚未创建的情况。如果这个时候调用了创建目录的方法,就会非常耗时。getBoolean(String key, boolean defValue)这个方法和所有获取key的方法一样,都可能存在耗时。从SharedPreferencesImpl
的构造方法,我们知道会开启一个新的线程,将内容从文件中读取到缓存的map里,这个步骤我们叫load。主要耗时的方法,在awaitLoadedLocked里。这个方法,调用了mLock.wait()免费云主机域名
,释放了mLock
的对象锁,并且进入等待池,直到load完被唤醒。总结:所以,getBoolean
等获取key
的方法,会等待,直到sp的内容从文件中copy到缓存map里。很可能存在耗时。commit()commit()
方法,会进行同步写,一定存在耗时,不能直接在主线程调用。apply()大家都知道apply
方法是异步写,但是也可能造成ANR的问题。下面我们来看apply
方法的源码。可以看到这里确实是在子线程进行的写入操作,但是为什么说apply
也会引起ANR呢?因为在Activity
和Service
的一些生命周期方法里,都会调用QueuedWork.waitToFinish()
方法,这个方法会等待所有子线程写入完成,才会继续进行。主线程等子线程,很容易产生ANR问题。Android 8.0 在这里做了一些优化,但还是需要等写入完成,无法完成解决ANR的问题。到此,关于“SharedPreference引发ANR原理是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!
这篇文章主要介绍“MySQL索引知识点分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL索引知识点分析”文章能帮助大家解决问题。索引在关系型数据库中,是一种单独的、物理的对数据库表中的一列或者多列值进行排序的…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。