Android ANR产生的原因及定位分析

来源:互联网 发布:urlencoder函数php 编辑:程序博客网 时间:2024/05/22 17:45

只有当App的UI线程响应超时才会引起ANR,超时一般有两种:1、当前的事件没有机会得到处理,例如UI线程正在响应另一个事件,当前事件由于某种原因被阻塞了;2、当前的事件正在处理,但是耗时太长没能及时完成。

典型的ANR问题场景:

1、UI线程存在耗时操作,例如UI线程中存在网络请求、数据库操作或者文件操作等。Android 4.0以后,如果在UI线程进行网络操作会直接报异常

2、UI线程等待子线程释放某个锁,从而无法处理用户输入

3、耗时的动画需要大量的计算工作,导致CPU负载过重

ANR的避免和检测:

1、利用StrictMode,是Android SDK提供的一个用来检测代码中是否存在违规操作的工具类,主要用来检测两大类问题:ThreadPolicy线程策略和VmPolicy虚拟机策略,ThreadPolicy主要用来检测可能存在的耗时操作,VMPolicy用来检测是否存在泄漏。只能在debug版本中使用它。

2、BlockCanary,第三方性能监控函数库,和LeakCanary类似,不过他是用来检测应用主线程的卡顿,而LeakCanary是用来检测内存泄漏的。基本原理是利用主线程的消息队列机制,通过对比消息分发开始和结束时间点来判断是否超过设定的时间,如果是,则判断为主线程卡顿。集成方法也很简单,在build.gradle中添加依赖,在application的oncreate方法中初始化调用BlockCanary.install(this,new AppBlockCanaryContext().start())即可。

原创粉丝点击