ANR概述
ANR(Application Not Responding)是指应用程序未响应,Android中一个Activity的执行时间是5秒,超过5秒无响应则会弹出ANR对话框,在一个广播接收者中,最长的执行时间是10秒,在这段时间内可以完成一些操作,若在10秒之内没有完成,则会造成ANR。
造成ANR的主要原因
要介绍造成ANR的原因,我们首先要了解一下系统是如何知晓应用程序的响应性的。
应用程序的响应性是由Activity Manager和Windows Manager系统服务来监视的,当出现超时未响应操作,即会造成ANR。
主要原因:
- 主线程被IO操作(在4.0之后网络IO不允许在主线程中)阻塞
- 主线程中出现耗时操作
那么Android中有哪些操作是在主线程中的呢?
- Activity的所有生命周期回调都是执行在主线程中的
- Service(服务)默认是执行在主线程中
- BroadcstReceiver的onReceiver回调是执行在主线程中的
- 没有使用子线程的looper的Handler的handlerMessage.post(Runnable)是执行在主线程中的。
- AsyncTask的回调除了doInBackgroud,其他操作均在主线程中执行
如何解决ANR
- 使用AsyncTask处理耗时IO操作
- 使用Thread或者HandlerThread提高优先级
- 使用Handler来处理工作线程中的耗时任务
- 在Activity的【初始化】onCreate()和【运行时】onResume()回调中尽量避免耗时代码