• 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.告知可能在主线程做了太多的工作。

  • 相关阅读:
    TensorFlow学习('utf-8' codec can't decode byte 0xff in position 0: invalid start byte)
    Python常用库之三:Matplotlib
    线性回归 Python实现
    go 算法 查询字符在字符串中的位置
    Python与Go快速排序
    Python与Go斐波那契数列
    Python与Go选择排序
    Python与Go插入排序
    Python与Go冒泡排序
    git clone直接提交用户名和密码
  • 原文地址:https://www.cnblogs.com/spbyyy/p/14057576.html
Copyright © 2020-2023  润新知