ANR 出现的场景以及解决方案

application not response 简称ANR ,应用程序无响应。当应用在5秒内对用户输入或点击等事件无响应时,Android便会认为应用无响应,弹出ANR 提示窗

1.产生场景

activity内对事件 5秒无法完成处理
BroadcastReceiver 内对事件10秒无法完成处理
Service 的各个生命周期函数在特定时间(20秒)内无法完成处理

2.原理

Android 应用在启动时会创建一个UI线程,该线程只负责UI界面更新,在该线程中进行耗时操作会导致线程阻塞,可能引起ANR

3.定位分析

当一个进程发生了ANR了以后,系统会在/data/anr目录下创建一个文件traces.txt,通过分析这个文件就能定位出ANR的原因。
文件导出

 adb pull /data/anr/traces.txt 

或者也可以直接查看lockat日志进行分析

4.检测预防

1.使用Android SDK自带的StrictMode(严格模式)进行检测
StrictMode使用教程地址:
https://droidyue.com/blog/2015/09/26/android-tuning-tool-strictmode/
2.使用BlockCanary
BlockCanary是一个非侵入时的性能监控函数库,其特点有:
a.非侵入式,简单的两行就打开监控,不需要到处打点,破坏代码优雅性。
b.精准,输出的信息可以帮助定位到问题所在(精确到行),不需要像Logcat一样,慢慢去找。
目前包括了核心监控输出文件,以及UI显示卡顿信息功能且集成简单快速
教程:
https://www.jianshu.com/p/cd7fc77405ac

5.解决

解决方案写下来其实就是一句话的事:不要再主线程进行耗时操作,涉及网络请求、文件读取、数据库访问等耗时操作的事件尽量开一个子线程去执行。具体ANR 的避免还是需要在日常编码中注意规范。

你可能感兴趣的:(ANR 出现的场景以及解决方案)