在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或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为应用程序被冻结了。
分享到:
相关推荐
本解决方案旨在探讨如何有效压缩Android中的图片,避免ANR现象,提高用户体验。 首先,理解ANR全称为Application Not Responding,当Android系统检测到主线程被阻塞超过5秒钟时,就会向用户显示ANR对话框。图片加载...
ANR软件可能是针对这一问题的一种解决方案或者分析工具,旨在帮助开发者诊断和解决应用卡死的问题。 ANR.exe可能是一个与ANR相关的执行文件,它可能包含了用于分析和调试Android应用程序性能的工具。在Windows环境...
本项目“防止ANR错误HandlerThread多线程解决耗时操作MyProject.zip”提供了一个实用的解决方案。 HandlerThread是Android提供的一个用于在后台线程执行任务的类,它是基于Thread和Looper的。在Android中,主线程...
### ANR(自动网络补充)技术详解 #### 技术背景及重要性 ...综上所述,ANR技术是NVR系统中一项至关重要的技术,它不仅提升了视频监控系统的整体性能,也为用户提供了更加安全可靠的视频存储解决方案。
通过这个Demo,开发者不仅可以学习如何使用"ANRWatchDog"库,还能了解到主线程阻塞可能导致的问题和解决方案。优化主线程性能,避免长时间的阻塞操作,是提升Android应用流畅性的重要手段。常见的主线程优化策略包括...
本压缩包中的资源提供了关于如何在Android系统中有效地进行图片压缩,以避免ANR现象的一系列解决方案。 首先,我们要理解ANR(Application Not Responding)是什么。当一个Android应用在主线程上执行耗时操作超过5...
由于信息有限,我们无法获取更多关于这个工具的具体功能和特性,但我们可以根据ANR的常见解决方案来推测其可能包含的功能。 ANR问题通常由以下原因引起:主线程阻塞、UI更新延迟、长时间的数据库操作或网络请求等。...
【标题】:“filemanager ANR log”指的是在使用File Manager应用程序时出现的“Application Not Responding”(ANR)日志。ANR错误通常在Android系统中...通过分析和调试ANR日志,可以定位问题并提出相应的解决方案。
本文将深入探讨如何解决帧动画引发的OOM问题,以及如何确保动画流畅运行。 首先,理解帧动画的工作原理至关重要。在Android中,帧动画是通过`AnimationDrawable`类实现的,它将一系列的图片资源(如PNG或JPEG格式)...
Android性能优化 ANR 分析指导文档 一、什么是 ANR? 在 Android 系统中,应用程序的响应性是由 Activity Manager 和 WindowManager 系统服务监视的。...这些方法可以帮助我们调试 ANR 问题,并找到解决方案。
【泛质量管理解决方案】是一种以数据为驱动的智能DevOps流程,旨在通过数据化、标准化和自动化的方式提升软件质量。此方案旨在解决传统移动QA仅关注效率和成本、问题追查被动、质量感知模糊以及测试技术缺乏积累的...
在本文中,我们将详细探讨ATV切台时出现ANR的问题及其解决方案。 问题描述: 当用户通过遥控器快速切换ATV频道(channel up/down)时,系统可能会报告ANR错误。这是因为切换频道的过程需要大约1到2秒的时间来完成。...
针对这个问题,Android提供了一些解决方案来确保网络请求等耗时操作不在主线程中执行。以下是几种常见的处理方式: 1. 使用`AsyncTask`: `AsyncTask`是Android提供的一个轻量级异步任务框架,可以方便地在后台线程...
APK防二次打包解决方案是针对Android应用开发中一个普遍存在的问题——应用被重新打包并植入恶意代码或者广告的问题而提出的。这种做法不仅会损害开发者的利益,还会对用户的利益造成威胁。在解决这个问题的过程中,...
【阿里云泛质量管理解决方案】是阿里云提出的一体化质量管理体系,旨在构建高效、专业、立体的质量管理系统,以适应移动互联网时代的快速迭代和高质量交付需求。该解决方案将数据驱动、智能DevOps流程、自动化测试、...
华为视讯MCU方案介绍 华为视讯MCU方案是一个基于IP网络的综合媒体交换平台,提供了丰富的...华为视讯MCU方案是一个功能强大、灵活性高的综合媒体交换平台,提供了多种技术创新和解决方案,满足不同应用场景的需求。
ANR的解决方案包括: * 避免死锁的出现,使用子线程来处理耗时操作 * 避免主线程qurey provider,不要滥用sharePreference的commit()方法 * 各大组件生命周期中也应避免耗时操作,注意BroadcastReciever的onRecieve...
### Android中ListView与GridView加载图片的线程并发解决方案 在Android开发中,处理ListView和GridView这类组件时,尤其是在大量图片的加载过程中,线程管理变得至关重要。不当的线程处理可能导致应用性能下降,...
此外,对于常见卡顿问题,需要有针对性的解决方案,例如理解问题的根本原因,自动化获取卡顿信息,以及制定一整套卡顿问题的解决流程。 最后,卡顿优化的常见问题通常涉及到如何进行优化实践、自动化收集信息以及...
解决方案三:ANR 的 DRX 参数优化 ANR 的 DRX 参数优化可以提高 ECGI 读取的成功率,避免读取 ECGI 失败的问题。 四、经验总结 本文通过分析读取 ECGI 失败的原因,提出了三种优化方法,以解决读取 ECGI 失败的...