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

本文介绍了Android应用程序中出现ANR(Application Not Responding)的原因及其典型场景,并提供了两种避免和检测ANR的方法:使用StrictMode工具类检测违规操作,以及采用BlockCanary第三方库监控主线程卡顿。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只有当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())即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值