ANR 是什么?怎样避免和解决 ANR
ANR:Application Not Responding,即应用无响应
ANR 一般有三种类型:
KeyDispatchTimeout(5 seconds)
主要类型,按键或触摸事件在特定时间内无响应BroadcastTimeout(10 seconds)
BroadcastReceiver 在特定时间内无法处理完成ServiceTimeout(20 seconds)
小概率类型,Service 在特定的时间内无法处理完成
超时的原因一般有两种:
- 当前的事件没有机会得到处理(UI 线程正在处理前一个事件没有及时完成或者 looper 被某种原因阻塞住)
- 当前的事件正在处理,但没有及时完成
UI 线程尽量只做跟 UI 相关的工作,耗时的工作(数据库操作,I/O,连接网络或者其他可能阻碍 UI 线程的操作)放入单独的线程处理,尽量用 Handler 来处理 UI thread 和 thread 之间的交互。
UI 线程主要包括如下:
- Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick()
- AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel()
- Mainthread handler: handleMessage(), post(runnable r)
查找 ANR 的方式:
- 导出
/data/data/anr/traces.txt
,找出函数和调用过程,分析代码 - 通过性能 LOG 人肉查找
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
下一篇: Android 自定义权限的作用
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论