出现类型:
1、按键或触摸事件在规定事件内未响应。
2、BroadcastReceiver在特定时间内未完成处理。
3、小概率service在特定时间内为完成处理。
常见的超时引发的ANR
Activity: onCreate(), onResume(), onDestroy(),
onKeyDown(), onClick()等,超时时间5s
Application: onCreate(), onTerminate()等,超时时间5s
Service: onCreate(), onStart(), onDestroy()等,超时时间20s
BroadcastReceiver:onReceiver(),前台APP广播超时时间是10s,后台App是60s
AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel()等,超时5s
Mainthread handler: handleMessage(), post*(runnable r)等,超时5s
导致原因:
1、高耗时的操作,如图像变换
2、磁盘读写,数据库读写操作
3、大量的创建新对象
如何避免:
1、UI线程尽量只做跟UI相关的工作
2、耗时的操作(比如数据库操作,I/O,连接网络或者别的有可能阻塞UI线程的操作)把它放在单独的线程处理
3、尽量用Handler来处理UIThread和别的Thread之间的交互
4、解决的逻辑
(1)使用AsyncTask
在doInBackground()方法中执行耗时操作
在onPostExecuted()更新UI
(2)使用Handler实现异步任务
在子线程中处理耗时操作
处理完成之后,通过handler.sendMessage()传递处理结果
在handler的handleMessage()方法中更新UI
或者使用handler.post()方法将消息放到Looper中
捕获ANR异常信息:
app在产生ANR异常后,会将异常信息写入"/data/anr/traces.txt"文件我们可以通过收集用户的这个文件,就可以来获取用户产生ANR的地方了。