可能会存在这样的情况,你写的代码通过了世界上所有的性能测试,但当用户尝试使用你的应用程序时,仍然让用户感到不爽。应用程序响应不够灵敏的地方包括——反映迟钝,挂起或冻结很长时间,或者需要花费很长的时间来处理输入。
在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或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为应用程序被冻结了。
分享到:
相关推荐
本文将通过一个具体的死锁导致的ANR实例,解析如何利用Android trace文件来分析和解决这类问题。 当Android系统检测到ANR发生时,会在/data/anr/目录下自动生成一个trace文件,其中包含了系统运行时的详细信息,如...
在Android应用开发中,ANR(Application Not Responding)是一个常见的问题,表示用户界面无响应,这通常是由于主线程被长时间阻塞导致的。`Android-ANR-WatchDog`是一个专门为解决这个问题而设计的开源工具,它能够...
在EX04_ANR这个压缩包中,可能包含了一些关于如何分析和解决ANR问题的实例代码或教程资料。通过对这些内容的学习,开发者可以更深入地理解ANR的原理,并掌握防止和解决ANR的方法,从而提高应用的用户体验。
ANR(Application Not Responding)问题是Android应用开发者经常会遇到的问题,尤其对于初学者来说,解决这类问题往往比较棘手。ANR问题通常发生在Android应用无法在规定时间内响应输入事件或广播消息时,导致系统弹...
Android性能优化 ANR 问题分析
Android ANR文件,用于对ANR分析的例子文件
总的来说,理解和分析ANR对于优化Android应用的性能至关重要。通过遵循最佳实践,避免阻塞UI线程,及时处理事件,以及有效地利用多线程,开发者可以显著降低应用程序出现ANR的风险,提升用户体验。
Android ANR 分析 ANR(Application Not Responding)是 Android 中的一个错误状态,当应用程序在 5 秒内没有响应输入事件或 BroadcastReceiver 在 10 秒内没有执行完毕时,Android 就会针对特定的应用程序显示 ANR...
本文档"ANR代码流程分析.doc"将深入探讨ANR的产生原因及其相关的代码流程,这对于Android开发者理解和解决这类问题至关重要。 ANR现象通常出现在以下几种情况: 1. 主线程执行耗时操作:主线程负责处理用户交互,...
### Android之ANR的原理(Input, Service, Broadcast) #### ANR概述 ANR(Application Not Responding)是指Android应用程序在执行过程中响应超时的一种异常状态。当应用程序长时间不响应用户的操作时,系统会提示...
Android ANR详细介绍以及案例分析,对理解ANR具体原理有说明,并且列举大量实例解决实际问题,不可多得的稳定性文档。
- **崩溃报告**:使用如Crashlytics等第三方服务收集崩溃报告,以便于分析和修复问题。 4. **权限管理**: - 对于Android 6.0及更高版本,需要在运行时请求`WRITE_EXTERNAL_STORAGE`权限,以便将错误信息写入外部...
ANR(Application Not Responding)日志分析是 Android 开发者需要掌握的重要技巧之一。ANR 的产生机制可以分为四类:输入事件超时、广播类型超时、服务超时和 ContentProvider 类型超时。ANR 的原因也可以分为两类...
Android性能优化 ANR 分析指导文档 一、什么是 ANR? 在 Android 系统中,应用程序的响应性是由 Activity Manager 和 WindowManager 系统服务监视的。当应用程序出现以下情况时,Android 就会针对特定的应用程序...
Android ANR 实例分析-附件资源
Android ANR(Application Not Responding)的分析 ANR (Application Not Responding) ANR定义:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无...
"安卓日志分析崩溃拦截相关-防止应用程序奔溃抛出错误异常防止应用程序anr.rar"这个资源包聚焦于一个核心问题:如何避免应用程序出现异常崩溃和ANR(Application Not Responding)错误。下面将详细解释相关知识点。 ...
该文档主要介绍什么是anr, anr的三种类型,三种类型的具体分析,如何避免anr等等。。
ResultFile很可能是执行ANR分析后的结果文件,包含了诊断过程中的数据和分析报告。这包括但不限于应用崩溃日志、系统日志、内存使用情况、线程状态等,开发者可以通过分析这个文件找出导致ANR的具体原因。 在处理...