欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

避免出现anr的方法_ANR原因及解决方法

发布时间:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的这篇文章主要介绍了 避免出现anr的方法_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

总结

以上是生活随笔为你收集整理的避免出现anr的方法_ANR原因及解决方法的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。