1 简介
ANR
(Application Not Responding
),程序长时间无响应。系统长时间无法处理某个操作,就会弹出ANR
对话框。
在Android
系统中,ActivityManagerService
(简称AMS
)和WindowManagerService
(简称WMS
)会检测APP
的响应时间,如果APP
在特定时间无法相应屏幕触摸或键盘输入,或者特定事件没有处理完毕,就会出现ANR
。
以下四个条件都可以造成ANR
发生:
InputDispatching Timeout
:5s
内无法响应屏幕触摸事件或键盘输入事件;Service Timeout
:前台服务20s
内,后台服务在200s
内没有执行完毕;BroadcastQueue Timeout
:在执行前台广播的onReceive
方法时10s
没有处理完成,后台为60s
;ContentProvider Timeout
:ContentProvider
的publish
在10s
内没进行完;
造成以上ANR
的首要原因就是在主线程中做了太多的耗时操作,例如读写文件,访问数据库,网络请求等。因此,尽可能的避免在主线程中做耗时操作。
2 ANR
分析
在MainActivity
中生成一个按钮跳转到ANRActivity
中,在后者的onCreate()
中主线程休眠20s
:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_anr_test);
// 这是Android提供线程休眠函数,与Thread.sleep()最大的区别是
// 该使用该函数不会抛出InterruptedException异常。
SystemClock.sleep(20 * 1000);
}
在进入ANRActivity
后黑屏一段时间,再过几秒,弹出了ANR
异常:
日志打印:
2022-06-26 07:57:59.031 559-8280/system_process E/ActivityManager: ANR in com.example.kotlintest (com.example.kotlintest/.ui.MainActivity)
PID: 8213
Reason: Input dispatc