Android ANR 原因分析与检测
ANR,即应用程序不响应(Application Not Responding)。在主线程中进行某些耗时操作,超过一定时间,系统就会弹出ANR对话框。此时可以选择等待,让程序跑完,也可以选择关闭应用程序。
一、 ANR 原因分析
只有当应用程序的UI线程响应超时才会引起ANR,超时产生的原因一般有两种:
当前事件没有机会得到处理,例如UI线程正在响应另一个事件,当前事件由于某种原因被阻塞了
当前事件正在处理,但是由于耗时太长未能及时完成
本质上,产生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