1、什么是ANR
ANR是“Application Not Responding”缩写,应用程序无响应,直观的说就是
"咦?卡了?"
2、发生ANR的条件
应用程序的响应性是由ActivityManager和WindowManager系统服务监视的,当ANR发生条件满足时,就会弹出ANR的对话框
- Activity超过5秒无响应
- BroadcastReceiver超过10秒无响应
- Service超过20秒无响应
3、ANR的产生和处理
- 主线程阻塞:开辟单独的子线程进行处理;
- CPU满负荷:I/O阻塞的,I/O阻塞一般来说就是文件读写或数据库操作执行在主线程了,也可以通过开辟子线程的方式异步执行;
- 内存不够用的:增大VM内存,使用LargerHeap属性,排查内存泄露等
4、哪些地方是运行在UI主线程的
- Activity的所有生命周期回调都是执行在主线程的
- Service默认执行在主线程中
- BoardcastReceiver的回调onReceive()执行在主线程中
- AsyncTask的回调除了doInBackground,其他都是在主线程中
- 没有使用子线程Looper的Handler的handlerMessage,post(Runnable)都是执行在主线程中
- View的Post(Runnable)是运行在主线程的
5、如何解决ANR
- 使用AsyncTask处理耗时IO操作
- 使用Thread或HandlerThread提高优先级
- 使用Handler处理工作线程的耗时操作
- Activity的onCreate和onResume回调尽量避免耗时操作
- SharedPreference.Editor中使用apply导致anr,推荐commit
6、使用子线程的方式
- 启用Thread,继承Thread或者实现Runnable接口的方式
- HandlerThread
- AsyncTask
- IntentService