ANR的定义:

在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。

一般说来,如果应用程序不能响应用户输入的话,系统会显示一个ANR。例如,一个应用程序阻塞在一些I/O操作上(通常是网络访问),这时,应用程序的主线程就不能再处理用户的输入事件。经过一定的时间后,系统认为应用程序已经挂起,并显示ANR来让用户选择杀死应用程序。

什么引发了ANR?

在Android里,应用程序的响应性是由Activity Manager和Window Manager系统服务监视的。当它监测到以下情况中的一个时,Android就会针对特定的应用程序显示ANR:

·         在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)

·         BroadcastReceiver在10秒内没有执行完毕

如何避免ANR?

考虑上面的ANR定义,让我们来研究一下为什么它会在Android应用程序里发生和如何最佳构建应用程序来避免ANR。

Android应用程序通常是运行在一个单独的线程(例如,main)里。这意味着你的应用程序所做的事情如果在主线程里占用了太长的时间的话,就会引发ANR对话框,因为你的应用程序并没有给自己机会来处理输入事件或者Intent广播。

因此,运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成。然而,不是说你的主线程阻塞在那里等待子线程的完成——也不是调用Thread.wait()或是Thread.sleep()。替代的方法是,主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由于5秒输入事件的超时引发的ANR对话框。这种做法应该在其它显示UI的线程里效仿,因为它们都受相同的超时影响。

IntentReceiver执行时间的特殊限制意味着它应该做:在后台里做小的、琐碎的工作如保存设定或者注册一个Notification。和在主线程里调用的其它方法一样,应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个Service。顺便提及一句,你也应该避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广播时需要向用户展示什么,你应该使用Notification Manager来实现。

增强响应灵敏性

一般来说,在应用程序里,100到200ms是用户能感知阻滞的时间阈值。因此,这里有一些额外的技巧来避免ANR,并有助于让你的应用程序看起来有响应性。

·         如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度(ProgressBar和ProgressDialog对这种情况来说很有用)。

·         特别是游戏,在子线程里做移动的计算。

·         如果你的应用程序有一个耗时的初始化过程的话,考虑可以显示一个Splash Screen或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为应用程序被冻结了。

ps:参考:http://blog.csdn.net/Zengyangtech/article/details/6025671

http://www.cnblogs.com/xirihanlin/archive/2010/01/07/1641621.html

什么是ANR 如何避免它相关推荐

  1. 为什么“15。。。”会导致微信ANR?

    本文目的在于学习研究Android技术,若有侵犯,联系作者将及时删除. 本文同步自wing的地方酒馆 首先,微信发生ANR以后,会生成traces.txt文件.通过adb 导出 adb pull /d ...

  2. Android ANR产生的原理和如何避免

    在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框.用户可以选择 ...

  3. Android ANR异常及解决方法

    2019独角兽企业重金招聘Python工程师标准>>> 今天面试遇到这道题,刚开始没看出这个anr缩写的意思,后来问了面试官原来是这个意思: ANRs ("Applicat ...

  4. Android Service、 BroadcastReceiver、ContentProvider ANR 原理详解

    Service ANR: 启动Service 的时候,会调用到ActiveServices 类的 realStartServiceLocked方法. private final void realSt ...

  5. android Anr Input类型系统源码解析

    我们常说Input超时,都是指的是Input事件分发超时,因此整个超时计算以及触发都在InputDispatcher这个类中.其代码路径如下:/frameworks/native/services/i ...

  6. Android ANR 分析

    首先贴一下trace 文件 Process: com.oppo.reader PID: 20358 Time: 2933175644_1545041895232 Flags: 0x38d83e44 P ...

  7. Service ANR问题

    错误堆栈: ActivityManager: ANR in com.oppo.reader PID: 8071 Reason: executing service com.oppo.reade//co ...

  8. Android ANR详解

    如何避免KeyDispatchTimeout 1:UI线程尽量只做跟UI相关的工作 2:耗时的工作(比如数据库操作,I/O,连接网络或者别的有可能阻碍UI线程的操作)把它放入单独的线程处理 3:尽量用 ...

  9. 长时间运行app,产生anr

    app需要实时的更新当前的地址位置信息,在位置监听中进行显示出来,包括经纬的转换,距离目标,在测试几个小时内没有问题,但是在12个小时以上就出现了界面点击无响应. 解决办法 调试发现监听中耗时10ms ...

  10. Widget上实时刷新图片,造成anr问题

    由于项目的需要,在widget的上要实时刷新图片,而且刷新的频率要随着方向传感器的改变而变化.刷新的频率较高,在正常情况下,无法打开widget对应的应用,提示应用无法响应,从而造成anr的问题.在终 ...

最新文章

  1. VMware虚拟机相关文件问题
  2. 在Jetson Xavier NX上安装torchvision编译报错:fatal error: libavcodec/avcodec.h: No such file or directory
  3. 通过已有SQL语句,生成数据库模型PDM
  4. 如何使用SAP UI5 Web Component for React的padding功能
  5. mysql 密码hash算法_如何用hash创建一个mySQL用户(‘sha256’,$salt.$password)?
  6. LeetCode 1292. 元素和小于等于阈值的正方形的最大边长(DP)
  7. Java--线程同步
  8. 计算机网络课程设计之网络聊天程序的设计与实现
  9. pcl之编译VTK时CMAKE中找不到Qt5X11Extras
  10. ubuntu系统下如何查看opencv版本
  11. python控制电脑休眠唤醒键_使用Python实现Wake On Lan远程开机功能
  12. 459-Linux基础(echo)
  13. php元换成万元,元换算成万元换算器(元与万元的换算器)
  14. SE Block (Sequeze and Excitation)
  15. Python字符串专项练习题(1-16)
  16. 指甲半月痕的奥秘!!
  17. springboot启动报Whitelabel Error Page
  18. 由高斯投影坐标反算成经纬度
  19. 解决Ubuntu无线网卡突然无法连接
  20. 最近 Github 上爆火的 Chrome 生产力神器 Omni 是什么鬼?

热门文章

  1. Vysor Pro破解助手
  2. 三星推出下一代企业服务器SSD;优克联与Lions Den达成合作;arpara VR头显及一体机全球首发 | 全球TMT...
  3. python to excel 路径_好消息!Python和Excel终于可以互通了!
  4. python转exe模块安装(py2exe/Pyinstaller/cx_freeze)
  5. Spring事务五边形
  6. access考试素材_中职ACCESS数据库月考试题(含素材)
  7. 2019.09.21 多校联合训练(普及组)
  8. 新旧政府采购评审办法差异点汇总
  9. 三次固支样条matlab,matlab连续梁程序的编制与使用
  10. 高燃!GitHub上标星75k+超牛的Java面试突击版