ANR
一.什么是ANR?(Application Not Responding)
1. : 应用程序无响应的对话框。
在规定的时间内没有处理完相应工作会出现anr.
对于一个合理的APP当中,绝对不可以出现anr
2.若超出一写时长会出现anr
①在默认的Activity中,执行时长为6s
②在广播中,执行时长为10s
二.造成anr的主要原因**在主线程中做了耗时操作
(1) 在主线程中做了耗时操作
从4.0之后网络操作不允许在主线程中进行,会直接抛出异常
(2) .主线程中存在耗时操作
如果主线程中开启了线程进行了耗时操作,也会造成anr弹窗
****尽量要把耗时的网络,数据库的读取操作,高耗时的计算在子线程中进行操作
避免的原因:不在主线程中进行耗时操作就会避免anr
[三.Android中哪些操作是在主线程中进行耗时操作的?
(1) .Activity中的所有生命周期回调都是执行在主线程中的
(2) Service默认就是在主线程执行的
1) 如果要进行会弹出anr弹窗
2) 如果想在Service中进行耗时操作,可以启用Android中的InstentService
(3) BroadcastReceiver的onReceve回调方法是执行在主线程的
说明广播接受者的onReceive回调方法也不能做耗时操作的
(4) AsyncTask的回调中除了dolnBackground,其他都是执行在主线程
四.如何解决anr?
(1) 使用AsyncTack处理耗时IO操作
AsyncTack:灵活的切换主线程到UI线程机制
(2) 使用Thread或者HandlerThread提高优先级
1) 都可以开启一个子线程
2) Thread:在子线程中不可以创建Handler
3) HandlerThread:在子线程中可以创建Handler,用Handler来发送消息,应为内部创建Lopper来关联消息队列
4) 如果Thread和HandlerThread不提高优先级那么就和主线程是一样的,仍然会造成anr
(3) 使用Handler来处理工作线程的耗时任务
Handler:可以让子线程一味地发送消息到主线程来处理一些耗时异步任务
(4) .Activity的OnCreate()和onResume()在回调中尽量去避免耗时的代码
Activity中的所有生命周期回调都是执行在主线程中的进行的
尽量避免去发生anr
网友评论