ANR全名Application Not Responding, 也就是"应用无响应". 当操作在一段时间内系统无法处理时, 系统层面会弹出ANR对话框.
1、为什么会产生ANR:
在Android里, App的响应能力是由Activity Manager和Window Manager系统服务来监控的. 通常在如下两种情况下会弹出ANR对话框:
- 5s内无法响应用户输入事件(例如键盘输入, 触摸屏幕等).
- BroadcastReceiver在10s内无法结束.
- Service 20s 内没有处理完毕
造成以上两种情况的首要原因就是在主线程(UI线程)里面做了太多的阻塞耗时操作, 例如文件读写, 数据库读写, 网络查询等等.
1、为什么会产生ANR:
在Android里, App的响应能力是由Activity Manager和Window Manager系统服务来监控的. 通常在如下两种情况下会弹出ANR对话框:
- 5s内无法响应用户输入事件(例如键盘输入, 触摸屏幕等).
- BroadcastReceiver在10s内无法结束.
- Service 20s 内没有处理完毕
造成以上两种情况的首要原因就是在主线程(UI线程)里面做了太多的阻塞耗时操作, 例如文件读写, 数据库读写, 网络查询等等.
2. 什么情况下会发生anr
(1). KeyDispatchTimeout(5 seconds) --主要类型按键或触摸事件在特定时间内无响应
(2). BroadcastTimeout(10 seconds) --BroadcastReceiver在特定时间内无法处理完成
(3). ServiceTimeout(20 seconds) --小概率类型 Service在特定的时间内无法处理完成
3. 超时原因
(1). 当前的事件没有机会得到处理(即UI线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了)
(2). 当前的事件正在处理,但没有及时完成
首先要知道事件发生的线程,一般来说大多数可能是ui线程操作超时,那么ui线程都有哪些呢:
(1). Activity 生命周期
(2). View post 的runnable方法 、 handler(MainLooper) 的 handleMessage()
(3). Asycktask 的 onPreExecute(), onPostExecute() , onProgressUpdate()方法
(4). Broadcast 的onReceive()
(5). Service
其他原因造成的anr:
(1). 线程死锁
(2). cpu 饥饿