本专栏专注分享大型Bat面试知识,后续会持续更新,喜欢的话麻烦点击一个关注
文末有资料包领取
一、前期基础知识储备
1.ANR错误定义:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作“应用程序无响应”(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。
默认情况下,在Android中Activity的最长执行时间是5秒(主要类型),BroadcastReceiver的最长执行时间的则是10秒,ServiceTimeout的最长执行时间是20秒(少数类型)。超出就会提示应用程序无响应(ANR错误)。
2.ANR错误出现原因:只有当应用程序的UI线程响应超时才会引起ANR 超时产生的原因包括:①当前事件没有机会处理,例如UI线程正在响应另外的事件,当前事件被某个事件给阻塞掉了;②当前事件正在处理 但是由于耗时太长没有能及时的完成。其他原因:③在BroadcastReceiver里做耗时的操作或计算;④CPU使用过高;⑤发生了死锁;⑥耗时操作的动画需要大量的计算工作,可能导致CPU负载过重。
二、ANR定位方式及优化
1.ANR错误定位——如果开发机器上出现ANR问题时,系统会生成一个traces.txt的文件放在/data/anr下,最新的ANR信息在最开始部分。通过adb命令将其导出到本地,输入以下字符:
$adb pull data/anr/traces.txt .
2.供选的优化ANR问题的方式:
1)为了执行一个长时间的耗时操作而创建一个工作线程最方便高效的方式是使用AsyncTask,只需要继承AsyncTask并实现doInBackground()方法来执行任务即可。为了把任务执行的进度呈现给用户,你可以执行publishProgress()方法,这个方法会触发onProgressUpdate()的回调方法。在onProgressUpdate()的回调方法中(它执行在UI线程)