`
talin2010
  • 浏览: 518944 次
  • 性别: 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是这么解释的呀。。。一次面试的笔试题,竟然都不知道是这样的。惭愧 惭愧

相关推荐

    ANR(自动网络补充)技术

    ### ANR(自动网络补充)技术详解 #### 技术背景及重要性 ...综上所述,ANR技术是NVR系统中一项至关重要的技术,它不仅提升了视频监控系统的整体性能,也为用户提供了更加安全可靠的视频存储解决方案。

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

    为了避免这类问题的发生,开发者需要深入理解ANR的成因原理、分析方法以及优化思路。 首先,我们来探讨ANR的成因。ANR是由于应用的主线程在5秒内未能处理完输入事件、执行完广播消息的响应、服务的bind/unbind/...

    android anr

    避免ANR的方法: 1. **使用AsyncTask**:对于耗时操作,应放在后台线程进行,如使用AsyncTask,这样不会阻塞主线程。 2. **IntentService**:处理耗时任务时,推荐使用IntentService,它会在单独的工作线程中运行,...

    ANR软件.rarANR软件.rar

    ANR.exe可能是一个与ANR相关的执行文件,它可能包含了用于分析和调试Android应用程序性能的工具。在Windows环境下,.exe文件通常是可执行程序的后缀。用户或开发者可以运行这个程序来检查和处理Android设备上的ANR...

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

    在Android系统中,ANR(Application Not Responding)是指应用程序无响应的错误,通常发生在用户界面线程上,导致用户无法进行任何操作。本文档"ANR代码流程分析.doc"将深入探讨ANR的产生原因及其相关的代码流程,这...

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

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

    ANR各种日志.rar

    当WatchDog发现系统服务器(System Server)无响应时,它会触发ANR,以防止系统冻结。这可能意味着System Server遇到了严重的阻塞或内存不足等问题。解决此类问题需要深入分析系统服务器的堆栈跟踪信息,找出导致...

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

    4. **线程优先级**:看门狗线程的优先级较低,确保它不会干扰主线程的正常运行,避免产生新的问题。 5. **资源效率**:`Android-ANR-WatchDog`设计得非常轻量,对设备资源的占用极小,不会影响应用的整体性能。 6....

    ANR的监测与定位Demo

    本"ANR的监测与定位Demo"提供了这样一个工具,它能帮助开发者实时监测应用中的ANR问题,并在出现ANR时迅速定位到问题根源。在实际开发中,定位ANR通常需要查看logcat日志,查找"Input dispatching timed out"这样的...

    防止ANR错误HandlerThread多线程解决耗时操作MyProject.zip

    HandlerThread是Android提供的一个用于在后台线程执行任务的类,它是基于Thread和Looper的。在Android中,主线程负责处理UI更新和用户交互,因此不应在主线程中执行耗时操作,否则可能导致ANR。使用HandlerThread...

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

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

    /data/anr/traces.txt案例

    每个线程的堆栈信息展示了它在ANR发生时正在执行的代码行,这样开发者就能找出哪个函数或代码块导致了阻塞。 在本案例中,我们有两个zip文件:100037A01_1534815924178.zip和100037A01_1534819492320.zip。这些文件...

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

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

    ANR-WatchDog,安卓系统.zip

    ANR-WatchDog就像是一个守护进程,持续关注应用的运行状态,一旦发现ANR现象,它可以立即采取行动,如记录日志、发送警报或者执行自定义的错误处理逻辑。 该开源项目的核心功能包括: 1. **实时监控**:ANR-...

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

    - **避免ANR**:确保主线程不执行耗时操作,使用AsyncTask或其他异步方法处理后台任务。 - **日志记录**:使用Android的Log类记录异常信息,便于调试。 - **崩溃报告**:使用如Crashlytics等第三方服务收集崩溃...

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

    ### Android之ANR的原理(Input, Service, Broadcast) #### ANR概述 ANR(Application Not Responding...这对于开发者来说至关重要,因为合理的处理可以避免不必要的ANR情况,从而提升应用程序的整体性能和用户体验。

    android anr分析方法

    为了避免这类ANR,开发者应遵循以下原则: 1. 尽量减少UI线程的工作负担,仅处理与界面更新相关的任务。 2. 将耗时操作(如数据库操作、I/O、网络请求等)放在单独的线程中执行。 3. 使用Handler或AsyncTask来协调...

    filemanager ANR log

    2. **异步编程**:为避免ANR,开发者应将长时间运行的任务放在后台线程执行,例如使用IntentService、AsyncTask或Java的Executor框架。 3. **资源管理**:确保在适当的时候关闭文件流和数据库连接,防止内存泄漏和...

    安卓日志分析崩溃拦截相关-防止应用程序奔溃抛出错误异常防止应用程序anr.rar

    - **主线程阻塞**:ANR通常发生在主线程(UI线程)上,当它因为执行长时间的操作而阻塞时。避免在主线程进行耗时操作,如网络请求、数据库操作或大量计算。 - **Handler/AsyncTask**:使用Handler、AsyncTask或...

    效能智优ANR.rar

    标题中的“效能智优ANR”可能是指一个针对Android系统优化的工具,因为ANR(Application Not Responding)是Android平台上常见的错误提示,通常当应用响应超时,系统会显示ANR对话框,让用户知道应用运行出现问题。...

Global site tag (gtag.js) - Google Analytics