Android中的ANR如何分析又如何避免
来源:互联网 发布:河北新闻联播网络直播 编辑:程序博客网 时间:2024/06/01 08:36
作为一名android开发人员,如果不知道ANR想必你的工作找的并不是很顺利吧!
作为一名有经验的android开发人员,ANR只是一种常识,伴随你整个的职业生涯。。。。。。
ANR是个什么玩意
ANR,是“Application Not Responding”的缩写,即“应用程序无响应”。系统会向用户显示一个对话框,用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。在Android中,应用程序的响应是由Activity Manager和WindowManager系统服务监视的 。当它监测到A、B、C情况中的一个时,Android就会针对特定的应用程序显示ANR:
A.在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)--主要类型
B.BroadcastReceiver在10秒内没有执行完毕
C.Service在特定时间内(20秒内)无法处理完成--小概率类型
造成ABC的原因有很多,比如在主线程中做了非常耗时的操作,如下载,io异常等。还需要注意的是产生这种ANR的前提是要有输入事件,如果用户没有触发任何输入事件,即便是主线程阻塞了,也不会产生ANR,因为InputDispatcher没有分发事件给应用程序,当然也不会检测处理超时和报告ANR了。
1.分析ANR
ANR发生时都会在log中输出错误信息,从log中可以获得ANR的类型,CPU的使用情况,CPU使用率过高有可能是CPU饥饿导致了ANR。CPU使用率过低说明主线程被block了,如果IOwait高是因为主线程进行I/O操作造成的。
除了log输出外,你会发现各个应用进程和系统进程的函数堆栈信息都输出到了一个/data/anr/traces.txt的文件中,这个文件是分析ANR原因的关键文件.要获取到该文件可使用adb指令进行赋权后拉出查看调用stack。通过log、trace.text、代码结合分析ANR的成因(iowait?Memoryleak?Block?)
2.怎么避免ANR
要避免问题的产生,就要抓住问题产生的原因(ABC三种):
1.避免在主线程上进行复杂耗时的操作,比如说发送接收网络数据/进行大量计算/操作数据库/读写文件等。这个可以通过使用AsyncTask或者使用多线程来实现。
2.broadCastReceiver 要进行复杂操作的的时候,可以在onReceive()方法中启动一个Service来处理
3.在设计及代码编写阶段避免出现出现同步/死锁或者错误处理不恰当等情况。
没有写博客的习惯,将就看看 ,无聊的时候会继续更新
- Android中的ANR如何分析又如何避免
- Android中的ANR异常如何分析又该怎么去避免ANR
- 如何避免android ANR
- Android ANR是什么?如何避免ANR
- Android中如何避免ANR
- Android ANR 以及如何避免
- Android如何分析ANR
- 什么是ANR,如何避免ANR
- 什么是ANR?如何避免ANR?
- 【Android】【ANR】如何分析解决Android ANR
- 如何避免Android程序的ANR
- Android ANR定义及如何避免
- Android—什么是ANR 如何避免它?
- android什么是ANR,如何定位和避免
- 什么是ANR,如何避免?
- 如何避免 ANR
- 什么是ANR,如何避免?
- 什么是ANR 如何避免
- css3样式前缀:-ms -moz -webkit -o
- 如何制作chm格式的帮助文件
- Java中的容器
- Swift中的Lazy与计算属性
- 异步AIO的研究
- Android中的ANR如何分析又如何避免
- 我的前端生涯实录,虽然才开始
- 1692: [Usaco2007 Dec]队列变换 后缀数组+贪心
- linux AIO (异步IO) 那点事儿
- UI组件之TextView及其子类(一)TextView和EditText
- 你得学会并且学得会的Socket编程基础知识
- [iOS]技术学习路线图(长期更新)[好久不见,
- Fast Calibration of Embedded Non-overlapping Cameras
- 计算机基础--Java中int char byte的关系