ANR

2019-05-26  本文已影响0人  米花噗噗

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

上一篇下一篇

猜你喜欢

热点阅读