ANR原因及解决方法

一、什么是ANR

ANR: Application not responding (应用无响应),系统会向用户显示一个对话框,用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”

二、ANR的类型

1、keyDispatchTimeout(5s)   --   主要类型

     按键或触摸事件在特定时间内无响应(按键按下、屏幕触摸等)

2、BroadcastTimeout(10 seconds)

       BroadcastReceiver在特定时间内无法处理完成

3、ServiceTimeout(20 seconds)   --   小概率类型

       Service在特定的时间内无法处理完成

三、如何分析ANR

ANR产生的原因是要有输入事件,若用户没有输入任何事件,即使主线程阻塞了,也不会ANR,因为InputDispatcher没有分发事件给应用程序,当然也不会检测处理超时和报告ANR了

1)ANR发生时都会在log中输出错误信息,从log中可以获得ANR的类型,CPU的使用情况:

CPU使用率过高有可能是CPU饥饿导致了ANR;

CPU使用率过低说明主线程被block了;

如果IOwait高是因为主线程进行I/O操作造成的。

2)除了看LOG,还可以从trace.txt文件查看调用stack。可以用如下命令获取trace.txt

$chmod 777 /data/anr

$rm /data/anr/traces.txt

$ps

$kill -3 PID

adbpull data/anr/traces.txt ./mytraces.txt

四、如何避免ANR

(1)避免在主线程上进行复杂耗时的操作,比如说发送接收网络数据/进行大量计算/操作数据库/读写文件等。这个可以通过使用AsyncTask或者使用多线程来实现。

(2)broadCastReceiver 要进行复杂操作的的时候,可以在onReceive()方法中启动一个Service来处理

(3)在设计及代码编写阶段避免出现出现同步/死锁或者错误处理不恰当等情况。

总结

主线程阻塞/挂起、死循环、内存泄漏、执行耗时操作、内存过大、CPU占用过高(文件读写频繁)都会造成crash


参考文档:如何分析解决Android ANR

                   ANR原因分析及解决方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 简介 现在感觉自己做的工作,基本上脱离Android了就是用java写代码,而且可能试用期完了就会被刷,很多东西是...
    我叫王菜鸟阅读 14,990评论 2 17
  • ==================================================== 一:什么...
    爱情小傻蛋阅读 13,331评论 3 31
  • 在实际情况中,当Android项目的用户量特别大时候,一些细小的问题也会被放大,ANR问题就是一个典型的例子。一些...
    Uprising阅读 54,264评论 4 116
  • 10月份的南印温差很大,即便在白天,山上和山下的温差依然很大。有了Rajesh,车里不再那么无聊,他边行驶边和我们...
    e9cc7819b665阅读 1,670评论 0 0
  • 很多人问我说,“你一天读书、骑行、做兼职、当志愿者、爱天爱地的四处漂流,这么瞎折腾,有什么意思呢,难道可以当饭吃?...
    痴人一念阅读 3,838评论 16 25

友情链接更多精彩内容