• Android ANR原因以及开发时如何预防


    经常可以在Android系统上发现ANR异常响应的问题。故了解一下ANR出现的原因

    一、

    Android系统中,应用程序的响应是由ActivityManager 和 WindowManger系统服务监视的,当它检测到以下情况时,Android就会针对特定的应用程序显示ANR:

    1.      主线程超过5S没有响应输入事件。(主要类型)KeyDispatchTimeout(5 seconds)

    2.      BroadcastReceiver 没有在10S 内返回。例如发送广播更改“控件属性”超过10S无效

    3.      Service在20S 内没有无法完成处理(小概率)

    二、

    什么是主线程(UI线程):

    当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。

    三、

    为什么UI线程没有响应:

    1.      当前的事件没有机会得到处理

    2.      当前的事件正在处理,但是没有及时完成

    四、

    如何避免ANR:

    1.      运行在主线程里的任何方法都尽量少的做事情,特别是Activity的关键生命周期方法,再更新UI时尽量用handler进行。

    2.      避免在BroadcastReceiver中做耗时的操作或者计算,如果响应广播时要做耗时操作的话可以使用“service”来进行。

    五、

    容易出现ANR的场景:

    1.      耗时的网络访问

    2.      大量的数据库读写操作

    3.      系统硬件操作

    4.      调用thread_join() / Sleep() / Wait() 或者等待locker的时候

    5.      同时运行的Service binder达到上线(binder主要是用来进程间通信的,但也可用在和本地service通信)

    6.      Service响应超时

    7.      非主线程持有lock,导致主线程等待lock超时

    8.      非主线程终止或者崩溃导致主线程一直等待

  • 相关阅读:
    SpringMVC日期类型转换问题三大处理方法归纳
    java 生成execl下载
    阿里maven仓库地址 和 oschina maven仓库地址
    hibernate基础学习
    学习struts2
    Linux下的/dev/sr0
    Oracle 19c(19.3) 单机数据库静默安装
    [转]Oracle 19C的下载和安装部署(图形安装和静默安装)
    CDH entropy was available 问题解决
    CDH当中NFS GATEWAY实例启动失败
  • 原文地址:https://www.cnblogs.com/liuchunxiao83/p/7986993.html
Copyright © 2020-2023  润新知