ANR

作者: 米花噗噗 | 来源:发表于2019-05-26 20:58 被阅读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

    相关文章

      网友评论

          本文标题:ANR

          本文链接:https://www.haomeiwen.com/subject/jygftctx.html