在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。

所以一个流畅的合理的应用程序中不能出现anr,而让用户每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样系统不会显示ANR给用户。默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。

如何来避免

考虑上面的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或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为应用程序被冻结了。

Android ANR产生的原理和如何避免相关推荐

  1. 看完这篇 Android ANR 分析,就可以和面试官装逼了!

    点击上方"何俊林",马上关注,每天早上8:50准时推送 真爱,请置顶或星标 本文转载自公号玉刚说,原创作者htkeepmoving,原文链接:https://www.jianshu ...

  2. ANR发生的原理是什么, 怎么排查

    定义 ANR 的全称是 Application No Responding,即应用程序无响应,具体是一些特定的 Message (Key Dispatch.Broadcast.Service) 在应用 ...

  3. Android RollBack机制实现原理剖析

    功能介绍: 在Android 10.0中,Google新增加了个功能. 如果用户对新升级的APP不满意,可以通过"回到过去",回滚到旧版. 当然,如果新安装的apk出现了各种问题无 ...

  4. Android:ANR问题是什么和如何避免

    文章目录 前言 一.ANR是什么? 二.ANR时间规定 1.Service Timeout 2.BroadcastQueue Timeout 3.ContentProvider Timeout 4.I ...

  5. android动画的实现原理,Android动画的实现原理 .

    1.动画运行模式 独行模式 中断模式 2.Animation类 每个动画都重载了父类的applyTransformation方法这个方法的主要作用是把一些属性组装成一个Transformation类, ...

  6. android 版本更新原理,Android系统Recovery工作原理之使用update.zip升级过程分析(二)...

    Android系统Recovery工作原理之使用update.zip升级过程分析(二)---update.zip差分包问题的解决 在上一篇末尾提到的生成差分包时出现的问题,现已解决,由于最近比较忙,相 ...

  7. Android Handler与Looper原理简析

    一直感觉自己简直就是一个弱智,最近越来越感觉是这样了,真的希望自己有一天能够认同自己,认同自己. 本文转载于:https://juejin.im/post/59083d7fda2f60005d14ef ...

  8. Android系统Recovery工作原理之使用update.zip升级过程分析(五)

    Android系统Recovery工作原理之使用update.zip升级过程分析(五)---update.zip包从上层进入Recovery服务文章开头我们就提到update.zip包来源有两种,一个 ...

  9. 【Android架构师java原理详解】二;反射原理及动态代理模式

    前言: 本篇为Android架构师java原理专题二:反射原理及动态代理模式 大公司面试都要求我们有扎实的Java语言基础.而很多Android开发朋友这一块并不是很熟练,甚至半路初级底子很薄,这给我 ...

最新文章

  1. 趣谈网络协议笔记-二(第十七讲)
  2. Pycharm环境调整
  3. Intellij IDEA + Maven——jar项目改成war项目相互转换
  4. java的格式化时间工具类
  5. 牛客 - 街机争霸(bfs)
  6. matlab 高斯迭代代码_用Matlab编写你的第一个有限元_《数值计算与程序设计》系列课程...
  7. 【解决问题】IDEA配置Tomcat添加Deployment时没有Artifact
  8. 安装docker1.10
  9. 【Elasticsearch】如何在Elasticsearch中查找相似的术语
  10. golang操作mongodb的驱动mongo-go-driver的事务支持和访问控制(mongodb4.0)
  11. 大家好 我是新来的
  12. 扫描仪标准模板滑动采集图像及其处理
  13. PAT B 1068 万绿丛中一点红(C语言)*排除法
  14. 笔记本损耗60 计算机提示,笔记本电池损耗60%多怎么处理!
  15. flutter 设置全屏背景图(导航栏)
  16. 微信小程序经纬度获取地图导航(导航接入第三方)
  17. 光与色的故事--颜色模型浅析
  18. C++控制不同进制输出(二进制,八进制,十进制,十六进制)各种进制之间的转换
  19. python怎么建立画板_Python3使用PyQt5制作简单的画板/手写板实例
  20. MySQL中修改ID为自增

热门文章

  1. 4句话让你明白什么是AI
  2. 巨变的时代、人工智能AI带来颠覆性的影响、技术十大趋势
  3. BAT面试题9:谈谈判别式模型和生成式模型?
  4. SAP MM ME81N PO Value Analysis报表中Net Value 为负数是怎么回事?
  5. 01_字符串处理-----03_替换和校正标识符
  6. 突发!美国最大输油管道遭网络攻击关闭!美媒:为其基础设施的脆弱堪忧
  7. 因果作用推断、因果网络学习及其他
  8. 【智能驾驶】自动驾驶深度感知技术对车和行人的检测
  9. 2018-2020年Gartner战略科技发展趋势一览!
  10. 增长率高达40%!物联网平台如何拉动产业马车飞速狂奔