Android ANR 原因分析与检测

本文详细分析了Android ANR(应用程序不响应)的原因,包括KeyDispatchTimeout、BroadcastTimeout和ServiceTimeout,并介绍了避免ANR的方法,如主线程处理和异步处理技术。同时,还讲解了如何通过Logcat、traces.txt日志和第三方统计SDK进行ANR的定位分析。最后提到了使用StrictMode和BlockCanary进行ANR检测。
摘要由CSDN通过智能技术生成

Android ANR 原因分析与检测

ANR,即应用程序不响应(Application Not Responding)。在主线程中进行某些耗时操作,超过一定时间,系统就会弹出ANR对话框。此时可以选择等待,让程序跑完,也可以选择关闭应用程序。

一、 ANR 原因分析

只有当应用程序的UI线程响应超时才会引起ANR,超时产生的原因一般有两种:

  1. 当前事件没有机会得到处理,例如UI线程正在响应另一个事件,当前事件由于某种原因被阻塞了

  2. 当前事件正在处理,但是由于耗时太长未能及时完成

本质上,产生ANR的原因有三种:KeyDispatchTimeout、BroadcastTimeout、ServiceTimeout

1.1 KeyDispatchTimeout

View的按键事件或者触摸事件这特定事件(5秒)内无法得到响应

1.2 BroadcastTimeout

BroadcastReceiver 的 onReceive()方法在特定时间(10秒)内无法完成处理(onReceive是运行在主线程的)

1.3 ServiceTimeout

Service 的各个生命周期函数在特定时间(20秒)内无法完成处理

二、ANR 避免

一个原则:主线程尽量只做UI相关的事,耗时操作(如文件读取,数据库读写等),计算量大的任务,在线程中执行,完成之后通过Handler来更新UI。

2.1 主线程

运行在主线程的有:
1. Activity的各个生命周期 onCreate(),onResume(),onDestory,点击/触摸事件等
2. Service的各个生命周期
3. BroadcastReceiver的onReceive()方法。
4. AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel
5. Mainthread handler: handleMessage(), post*(runnable r)
6. View的post()方法
在以上的这些方法内,尽量不要执行耗时的操作,如读写数据库,文件等。可以放在线程中运行,完成后再通知更新主线程。

2.2 异步处理技术

Android SDK提供了很多异步处理技术
1. Thread + Handler
2. HandlerThread
3. AsyncTask
4. IntentService

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值