经常可以在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.非主线程终止或者崩溃导致主线程一直等待

更多相关文章

  1. android 滑动事件冲突解决 Touch事件处理机制
  2. android 开机自启动的几种方法,监听不到RECEIVE_BOOT_COMPLETED的
  3. Android中实现ScrollView的滚动事件监听
  4. Android(安卓)触摸事件的传递过程
  5. Android开发笔记(一百一十七)app省电方略
  6. Android(安卓)Handler学习之异步与多线程(★推荐)
  7. Android消息处理
  8. android简单实例--------普通菜单optionMenu,上下文菜单ContextMe
  9. Android(安卓)模拟系统事件(一)

随机推荐

  1. 第五章 主生产计划MPS 第1~3节 计划方案
  2. 如何在Mac上设置和使用Apple Pay
  3. 飞鸽内网穿透操作使用说明
  4. 冒烟测试怎么做?
  5. 分布式机器学习中的拜占庭问题
  6. 新手正确提问姿势
  7. CentOS 7最小化安装对系统初始化
  8. 一块神奇的树莓派电子板竟让我学会了Linu
  9. 如何基于元学习方法进行有效的模型训练?四
  10. 为什么高手离不了Linux系统?我想这就是理