ANR相关问题分析
什么是ANR
如果有一段时间程序点击不够灵敏,系统就会向用户显示一个对话框,而这个对话框的内容就是anr(Application not responding)
让用户选择等待程序继续运行,同时也可以选择关闭对话框终止程序运行
结果就是非常影响用户体验
Activity最长时间五秒
广播最长的执行时间10秒
造成ANR的主要原因
这篇文章分析了源码,ANR原理分析
简单说就是主线程做了耗时操作,无法在规定时间内完成,造成ANR
主要原因有以下两点:
一、主线程被IO操作(4.0之后网络IO不允许在主线程中运行)阻塞
二、主线程中存在耗时的计算,比如一些网络数据读取
android中的哪些操作是在主线程?
-
Activity的所有生命周期回调都是执行在主线程
-
Service默认执行在主线程
-
BroadCastReceiver的onReceive回调是执行在主线程
-
没有使用子线程的looper的Handler的handleMessage方法和post(Runnable)也是执行在主线程,很好理解
-
AsyncTask的方法里除了doInBackground,其他都是执行在主线程中
如何解决ANR
-
使用AsyncTask 处理耗时IO操作
-
使用Thread或者HandlerThread提高优先级
可以使用Thread和HandlerThread来处理耗时操作,区别是HandlerThread自带Looper,可以创建Handler发送消息 -
使用Handler处理工作线程的耗时任务
-
在Activity的onCreate和onResume方法中尽量避免耗时的代码