`
talin2010
  • 浏览: 501506 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

什么是ANR 如何避免它?

阅读更多

ANR定义

在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示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或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为应用程序被冻结了。

部分引用自http://www.cnblogs.com/xirihanlin/archive/2010/01/07/1641621.html

分享到:
评论
1 楼 蓝月儿 2012-07-09  
anr是这么解释的呀。。。一次面试的笔试题,竟然都不知道是这样的。惭愧 惭愧

相关推荐

    如何分析及避免Android ANR问题.pdf

    本文对Android中常发生的ANR现象的成因原理及主要发生场景进行了简要介绍,举例了几种典型的ANR场景实例。总结提供了优化改善的若干解决思路。 值得Android开发人员收藏!

    android ANR

    该文档主要介绍什么是anr, anr的三种类型,三种类型的具体分析,如何避免anr等等。。

    Android开发中避免应用无响应的方法(Application Not Responding、ANR)

    本课讲的是如何保持应用响应,避免ANR。 什么触发ANR 通常,系统会在应用无法对用户输入响应时显示ANR。比如,如果一个应用在I/O操作上阻塞了(频繁请求网络)UI线程,系统无法处理用户输入事件。或者,在UI线程中,...

    andriod精华学习教程

    考虑上面的ANR定义,让我们来研究一下为什么它会在Android应用程序里发生和 如何最佳构建应用程序来避免ANR。 Android应用程序通常是运行在一个单独的线程(例如,main)里。这意味着你 的应用程序所做的事情如果在...

    Android ANR(Application Not Responding)的分析

    主要介绍了Android ANR(Application Not Responding)的分析的相关资料,这里说明什么原因出现应用程序的强制关闭,并说明该如何避免,需要的朋友可以参考下

    android 面试2

    21、什么是ANR,如何避免它? 答:ANR(Application Not Responding):应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应的对话框 避免ANR:Android应用程序通常运行在一个...

    Android代码-ArgusAPM

    360开源又一力作——ArgusAPM移动性能监控平台 项目背景 ArgusAPM是360手机卫士客户端团队继RePlugin之后...ANR分析:捕获ANR异常,解决APP的“未响应”问题 ArgusAPM特性 非侵入式 ​ 无需修改原有工程结构,无侵入

    测试管家:可靠的Android测试,为您服务

    它有什么作用? 稳定Android模拟器,以帮助防止由模拟器问题引起的测试失败。 禁用动画,以便Espresso测试可以正常运行。 禁用崩溃和ANR对话框,因此系统应用程序行为异常不会触发导致UI测试失败的弹出窗口。 锁定...

    黑马安卓基础教程day5 (总共day8)

    50_如何避免掉程序出现anr异常.avi 51_隐式意图和显示意图.avi 52_activity之间传递数据&批量传递数据.avi 53_启动activity并且获取他的返回值.avi 54_activity的生命周期01.avi 54_activity的生命周期02.avi 55_...

    Android开发性能优化总结

    一. 加载 预加载:1....1. 避免在UI线程做太多耗时操作,IntentReceiver > 10s Anr 2. 并发操作多用读写锁,少用synchronized,Android虚拟机Art直到Android6.0为止尚未对synchronized做CAS优化,而sy

    为了面试收集的一些java和安卓的知识点

    ANR 也就是在规定的时间内,没有响应。处理:避免在UI线程,BroadcastReceiver 还有service主线程中,处理复杂的逻辑和计算 layout_gravity和gravity的区别: layout_gravity:设置控件本身相对于父控件

    Kotlin-Firebase-Group-Chat:使用在Kotlin中构建的firebase(类似于whatsapp)进行群组和OneonOne聊天

    Kotlin-Firebase-Group-Chat 使用Kotlin内置的Firebase进行群聊。产品特点- 群聊一对一聊天Google登录建立群组删除讯息使用“回收者”视图对聊天消息进行反向分页。... (避免使用ANR) Bug修复屏幕截图

Global site tag (gtag.js) - Google Analytics