zoukankan      html  css  js  c++  java
  • ANR----以及如何定位是前端问题还是后台问题

    一、ANR说明和原因
    1.1 简介
    ANR全称:Application Not Responding,也就是应用程序无响应。

    1.2 原因
    Android系统中,ActivityManagerService(简称AMS)和WindowManagerService(简称WMS)会检测App的响应时间,如果App在特定时间无法相应屏幕触摸或键盘输入时间,或者特定事件没有处理完毕,就会出现ANR。

    以下四个条件都可以造成ANR发生:

    InputDispatching Timeout:5秒内无法响应屏幕触摸事件或键盘输入事件
    BroadcastQueue Timeout :在执行前台广播(BroadcastReceiver)的onReceive()函数时10秒没有处理完成,后台为60秒。
    Service Timeout :前台服务20秒内,后台服务在200秒内没有执行完毕。
    ContentProvider Timeout :ContentProvider的publish在10s内没进行完。
    1.3 避免
    尽量避免在主线程(UI线程)中作耗时操作。

    那么耗时操作就放在子线程中。
    关于多线程可以参考:Android多线程:理解和简单使用总结

    二、ANR分析办法
    2.1 ANR重现
    这里使用的是号称Google亲儿子的Google Pixel xl(Android 8.0系统)做的测试,生成一个按钮跳转到ANRTestActivity,在后者的onCreate()中主线程休眠20秒:

    在进入ANRTestActivity后黑屏一段时间,大概有七八秒,终于弹出了ANR异常。
    Google Pixel xl ANR.png
    2.2 ANR分析办法一:Log
    刚才产生ANR后,看下Log:

    可以看到logcat清晰地记录了ANR发生的时间,以及线程的tid和一句话概括原因:WaitingInMainSignalCatcherLoop,大概意思为主线程等待异常。
    最后一句The application may be doing too much work on its main thread.告知可能在主线程做了太多的工作。

  • 相关阅读:
    Android购物商城
    Android简易计算器
    安卓第四周作业
    第一次安卓作业
    十五周课后习题
    第十三周作业
    十三周上机练习
    第十二周作业
    第十二周练习
    11周上机作业(5.14)
  • 原文地址:https://www.cnblogs.com/zhangzetao/p/14057552.html
Copyright © 2011-2022 走看看