`
ice.k
  • 浏览: 286620 次
  • 性别: Icon_minigender_1
  • 来自: 荷兰
社区版块
存档分类
最新评论

Android 中的ANR 问题,响应灵敏性

阅读更多
可能会存在这样的情况,你写的代码通过了世界上所有的性能测试,但当用户尝试使用你的应用程序时,仍然让用户感到不爽。应用程序响应不够灵敏的地方包括——反映迟钝,挂起或冻结很长时间,或者需要花费很长的时间来处理输入。


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


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


相似地,如果你的应用程序花费太多的时间来构建详细的内存结构,或者也许是在游戏里花费太多时间来计算下一步移动,这时,系统会认为你的应用程序已经挂起。因此,确保这些计算是高效的往往很重要,但即使是最高效的代码仍然需要花费时间来运行。


在这两种情况下,解决的方法通常是创建一个子线程,然后在线程里做你的大部分工作。这能让主线程(驱动UI事件循环)保持运行,并阻止系统认为你的代码已经冻结。因为这些线程通常是在类级别上完成的,因此,你可以认为响应性能问题是一个类的问题。(与基本性能相比而言,基本性能问题认为是方法级别的问题)


这篇文章将讨论Android系统如何判断一个应用程序处于无响应状态,并为保证应用程序的响应性提供向导。


这篇文章囊括这些主题:

什么引发了ANR?
如何避免ANR?
增强响应灵敏性

1)什么引发了ANR?

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

在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)
BroadcastReceiver在10秒内没有执行完毕




一个ANR对话框显示给用户

2)如何避免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来实现。


3)增强响应灵敏性


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


如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度(ProgressBar和ProgressDialog对这种情况来说很有用)。
特别是游戏,在子线程里做移动的计算。
如果你的应用程序有一个耗时的初始化过程的话,考虑可以显示一个Splash Screen或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为应用程序被冻结了。
原文:http://www.cnblogs.com/xirihanlin/archive/2010/01/07/1641621.html
分享到:
评论
2 楼 SE_XiaoFeng 2013-07-12  
写的好.讲出了原因,和解决办法,这才是锦囊妙计.
1 楼 killpoer3 2010-12-23  
不错,正好解决我的问题

相关推荐

    Android-ANR-WatchDog一个用于检测AndroidANR(应用不响应)的watchdog

    在Android应用开发中,ANR(Application Not Responding)是一个常见的问题,表示用户界面无响应,这通常是由于主线程被长时间阻塞导致的。`Android-ANR-WatchDog`是一个专门为解决这个问题而设计的开源工具,它能够...

    android anr

    Android ANR,全称为"Application Not Responding",是Android操作系统中的一种错误状态,提示用户应用程序无响应。当一个应用程序在主线程上执行的操作超过了5秒钟而没有完成时,系统会认为该应用出现ANR问题,并弹...

    android7 关闭ANR对话框代码

    在Android系统中,ANR(Application Not Responding)是一个常见的问题,它表示应用程序无响应,通常出现在用户界面长时间无法交互时。在Android 7.0版本中,框架引入了一种新特性,即自动关闭ANR对话框,并允许...

    通过Android trace文件分析死锁ANR实例过程

    在Android开发过程中,Application Not Responding(ANR)是一个开发者经常遇到的问题,它表示应用程序对用户操作或系统服务请求反应过慢,导致用户体验下降。ANR的产生原因多种多样,其中包括CPU负载过高、输入事件...

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

    ANR(Application Not Responding)问题是Android应用开发者经常会...总之,ANR问题的解决需要开发者对Android应用的运行机制有较为深刻的认识,并能够在日常开发中不断积累经验,提高对异常情况的预见性和处理能力。

    ANR代码流程分析.doc.tar.gz_ANR分析_android_anr代码_shp

    通过对ANR错误报告的分析,我们可以定位到导致问题的具体代码行,然后优化相应代码,确保应用的响应性。例如,将耗时操作移动到异步任务中,或者使用IntentService来处理后台任务。 总之,理解和分析ANR的代码流程...

    Android图片压缩解决方案,解决图片加载过程中ANR现象

    本解决方案旨在探讨如何有效压缩Android中的图片,避免ANR现象,提高用户体验。 首先,理解ANR全称为Application Not Responding,当Android系统检测到主线程被阻塞超过5秒钟时,就会向用户显示ANR对话框。图片加载...

    我的总结--Android之ANR的原理(Input, Service, Broadcast)

    ANR(Application Not Responding)是指Android应用程序在执行过程中响应超时的一种异常状态。当应用程序长时间不响应用户的操作时,系统会提示用户该应用无响应,并提供是否强制关闭应用的选择。 #### Input处理...

    Android性能优化 ANR 问题分析

    Android性能优化 ANR 问题分析

    Android性能优化 ANR 分析指导文档

    在 Android 系统中,应用程序的响应性是由 Activity Manager 和 WindowManager 系统服务监视的。当应用程序出现以下情况时,Android 就会针对特定的应用程序显示 ANR: * 在 5 秒内没有响应输入的事件(例如,按键...

    android anr分析.docx

    ANR(Application Not Responding)是 Android 中的一个错误状态,当应用程序在 5 秒内没有响应输入事件或 BroadcastReceiver 在 10 秒内没有执行完毕时,Android 就会针对特定的应用程序显示 ANR 对话框。...

    Android异常捕获demo(可以捕获ANR+UncaughtExceptionHandler)

    在这个`Android异常捕获demo`中,开发者创建了一个名为`ANRWatchDog`的机制来监控应用的响应性。它会在检测到应用可能即将引发ANR时执行特定操作,例如记录日志或采取其他恢复措施。在Android 6.0(API级别23)及...

    Android ANR文件

    Android ANR文件,用于对ANR分析的例子文件

    android anr分析方法

    ANR,全称为Application Not Responding,是Android系统中一种重要的异常情况,表明用户界面无法正常响应用户的操作。当应用程序在指定时间内无法处理按键、触摸事件、BroadcastReceiver或Service时,系统会检测到...

    ANR-WatchDog:一个简单的看门狗,可检测到Android ANR(应用程序无响应)错误并引发有意义的异常

    android bug跟踪器中有一个问题条目描述了这种不足,请随时给它加注星标;) 它能做什么它设置了一个“看门狗”计时器,该计时器将检测UI线程何时停止响应。 这样做时,所有线程堆栈跟踪(主优先)都会引发错误。 它...

    ANR的监测与定位Demo

    ANR,全称为"Application Not Responding",是Android系统中用于表示应用程序无响应的错误提示。当一个Android应用的主线程在5秒内没有处理完事件(如UI更新、用户输入等)或者BroadcastReceiver在10秒内没有完成...

    浅谈Android ANR在线监控原理

    Android ANR在线监控原理是Android操作系统中的一种重要机制,能够有效地解决ANR问题,提高系统的稳定性和可靠性。开发者可以通过了解Watchdog监控机制的实现机理来更好地实现应用程序的监控和优化。

    ANR在软件可靠性中的应用.rar

    ANR(Application Not Responding,应用程序无响应)是Android操作系统中的一种常见错误状态,当用户界面无法正常响应用户的操作时,系统会显示ANR对话框,提示用户应用程序运行缓慢或未响应。在软件可靠性工程中,...

Global site tag (gtag.js) - Google Analytics