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或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为应用程序被冻结了。
----------
from:
http://blog.csdn.net/Zengyangtech/archive/2010/11/21/6025671.aspx
分享到:
相关推荐
那么,如何避免ANR的发生呢?开发者可以通过以下方法优化应用性能,从而减少ANR问题的出现: 1. 避免在主线程中进行耗时操作,比如网络请求、大数据处理、复杂的计算等操作,应使用异步任务处理。 2. 使用多线程或...
避免ANR的方法: 1. **使用AsyncTask**:对于耗时操作,应放在后台线程进行,如使用AsyncTask,这样不会阻塞主线程。 2. **IntentService**:处理耗时任务时,推荐使用IntentService,它会在单独的工作线程中运行,...
本解决方案旨在探讨如何有效压缩Android中的图片,避免ANR现象,提高用户体验。 首先,理解ANR全称为Application Not Responding,当Android系统检测到主线程被阻塞超过5秒钟时,就会向用户显示ANR对话框。图片加载...
为避免ANR的发生,开发者需要采取一些策略来优化应用程序的执行效率,特别是在进行耗时操作时。本项目“防止ANR错误HandlerThread多线程解决耗时操作MyProject.zip”提供了一个实用的解决方案。 HandlerThread是...
- **避免ANR**:确保主线程不执行耗时操作,使用AsyncTask或其他异步方法处理后台任务。 - **日志记录**:使用Android的Log类记录异常信息,便于调试。 - **崩溃报告**:使用如Crashlytics等第三方服务收集崩溃...
2. **异步编程**:为避免ANR,开发者应将长时间运行的任务放在后台线程执行,例如使用IntentService、AsyncTask或Java的Executor框架。 3. **资源管理**:确保在适当的时候关闭文件流和数据库连接,防止内存泄漏和...
二、如何避免 ANR? 要避免 ANR,需要遵循以下原则: * 运行在主线程里的任何方法都尽可能少做事情。 * 潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据 库...
Android ANR 分析 ANR(Application Not Responding)是 Android 中的一个错误状态,...本文总结了 ANR 的定义、引发原因、避免方法、检测和分析、解决方法等方面的知识点,为 Android 开发者提供了有价值的参考信息。
如果项目中包含多个模块,正确配置此文件有助于避免ANR这类问题,因为不正确的模块设置可能导致资源加载异常或依赖问题。 `AndroidPerformanceTools-master.iml`是Android Studio项目文件,包含了项目模块的配置...
通过这样的优化,ATV应用在处理快速频道切换时能够保持响应性,避免ANR问题的出现,从而提高用户体验。同时,这也展示了在多线程编程中如何有效地处理耗时操作,以避免阻塞主线程,是Android TV应用开发中的一个重要...
本压缩包中的资源提供了关于如何在Android系统中有效地进行图片压缩,以避免ANR现象的一系列解决方案。 首先,我们要理解ANR(Application Not Responding)是什么。当一个Android应用在主线程上执行耗时操作超过5...
该文档主要介绍什么是anr, anr的三种类型,三种类型的具体分析,如何避免anr等等。。
在Android系统中,ANR(Application Not Responding)是指应用程序无响应的错误,通常发生在用户界面线程上,导致用户无法进行任何操作。本文档"ANR代码流程分析.doc"将深入探讨ANR的产生原因及其相关的代码流程,这...
本课讲的是如何保持应用响应,避免ANR。 什么触发ANR 通常,系统会在应用无法对用户输入响应时显示ANR。比如,如果一个应用在I/O操作上阻塞了(频繁请求网络)UI线程,系统无法处理用户输入事件。或者,在UI线程中,...
7. **优化代码**:根据分析结果,优化代码以减少响应时间,比如使用更高效的算法,避免不必要的资源加载,或者合理安排任务的执行顺序。 8. **测试**:在不同设备和网络条件下进行测试,确保应用在各种环境中都能...
其中,避免 ANR 是系统性能优化的关键,可以通过优化线程任务、避免过度使用系统资源等方法来避免 ANR。 Android 多功能音乐播放器设计毕业设计涵盖了 Android 基本框架、系统需求分析、系统设计和实现、音乐播放器...
NVR端则会将这段时间内不完整的录像数据保存在缓冲区中,避免与完整录像数据混淆。 3. **自动修复录像**:ANR技术的第三步是自动修复NVR在网络不可用期间丢失的录像数据。通过网络实时侦测,前端设备和NVR都能够...
在Android平台上,MediaCodec是系统提供的一个核心API,...然而,实际应用中需要注意的问题很多,包括正确处理异常、避免ANR以及解决可能的黑屏问题。MediaCodecDemo是学习和实践这些技巧的宝贵资源,值得深入研究。
在Android开发过程中,Application Not Responding(ANR)是一个开发者经常遇到的问题,它表示应用程序对用户操作或系统服务请求反应过慢,导致用户体验下降。ANR的产生原因多种多样,其中包括CPU负载过高、输入事件...