什么是ANR
**ANR app not responding 应用无响应*
ANR的类型
ANR分为4种
- Input Dispatching Timeout :5s内 应用没有响应输入事件
- BrodcastReceiver 的 onReceive()函数10s无法处理完成,后台的时间限制为60s
- Service time out 前台服务20s内没有处理完事件,后台服务200s内
- Contentprovider的publish在10s内没有完成
ANR的主要原因
应用程序的响应性是由Activity和WindowManager系统服务监视的。
- 线程中存在耗时操作:
1.Activity的生命周期都在主线程
2.service默认在主线程
3.BoradcastReceiver 的 onReceive回调在主线程
4.没有使用子线程的looper的handler运行在主线程
5.View 的post(Runnable)执行在主线程 - CPU 满负荷
- 内存原因:内存泄漏,APP可用内存不够,突然加载大图片
如何避免ANR(核心:少在主线程做耗时操作)
- UI 只做 UI相关操作
- 耗时的操作(比如数据库,IO流,连接网络等)或者其他有可能的操作,放入其他线程;
- 尽量使用handler来处理UiThread和别Thread交互
- 降低子线程的优先级