1、什么是ANR(Application Not Responding)

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

A:KeyDispatchTimeout(5 seconds) --主要类型

按键或触摸事件在特定时间内无响应

BBroadcastTimeout(10 seconds)

BroadcastReceiver在特定时间内无法处理完成

C:ServiceTimeout(20 seconds) --小概率类型

Service在特定的时间内无法处理完成

造成以上情况出现的原因有很多,主要的原因是在主线程中做了非常耗时的操作,如下载、IO异常等。

2、如何避免ANR

一般耗时的操作,如网络及数据库的访问、高耗时计算(改变位图尺寸),应放在子线程中(或诸如数据库操作应通过异步请求的方式)来完成。不是让主线程阻塞在那里等待子线程完成,也不是调用Thread.wait()或Thread.sleep(),而是主线程应为子线程提供一个Handler,一旦完成后能提交给主线程。

主要做法:

A 运行在主线程的任何方法都应尽可能少做耗时的事,在Activity的onCreate()和onResume()等关键生命周期方法中要特别注意。可采用重开子线程的方式,然后使用Handler+Message的方式来处理耗时的操作,如更新主线程中的UI等。

B 应用程序应避免在BroadcastReceiver中做耗时的操作或计算。与activity中不同,BroadcastReceiver生命周期短,因此也不在子线程中做这些任务。如果相应Intent广播需要执行一个耗时的操作的话,取而代之的是,应让应用程序启动一个service来处理(此时应该想到IntentService)。

也要避免在BroadcastReceiver里启动一个Activity,因为这样会创建一个新的界面,会抢夺用户的操作焦点,影响用户体验。如果应用程序在相应Intent广播时需向用户展示,那么就应该用Notification Message来实现。

总结:ANR异常也是在程序中自己经常遇到的问题,主要的解决办法自己最常用的就是不要在主线程中做耗时的操作,而应放在子线程中来实现,比如采用Handler+mesage的方式,或者是有时候需要做一些和网络相互交互的耗时操作就采用asyntask异步任务的方式(它的底层其实Handler+mesage有所区别的是它是线程池)等,在主线程中更新UI。

http://www.cnblogs.com/xinye/p/3534013.html

http://blog.sina.com.cn/s/blog_618199e60101kvbl.html

http://teok.iteye.com/blog/1039742

ANR机制的更多相关文章

  1. handler与anr机制

    1. handler 参考资料:http://blog.csdn.net/ly502541243/article/details/52062179/ 首先说明Android的两个特性: 1. 只能在主 ...

  2. 谈谈 ANR 之 Service 超时

    1. 核心源码 关键类 路径(/frameworks/base/) ActiveServices.java services/core/java/com/android/server/am/Activ ...

  3. Android ANR优化 2

    在实际情况中,当Android项目的用户量特别大时候,一些细小的问题也会被放大,ANR问题就是一个典型的例子. 一些ANR问题只会发生在用户实际使用的情景,当系统资源比较紧张等一些特殊情况下才会遇到, ...

  4. ANR问题分析实例

    ANR监测机制包含三种: Service ANR,前台进程中Service生命周期不能超过20秒,后台进程中Service的生命周期不能超过200秒. 在启动Service时,抛出定时消息SERVIC ...

  5. 教你如何 分析 Android ANR 问题

    ANR介绍 ANR 的全称是 Application No Responding,即应用程序无响应,具体是一些特定的 Message (Key Dispatch.Broadcast.Service) ...

  6. Android应用博客目录

    应用有很多,开个博客都放进来方便查找,也方便修改 1 语言类: 1.1 JAVA 基础语言知识JAVA Collection与Collections,Array与Arrays的区别 JAVA练手--S ...

  7. Android事件分发机制浅谈(二)--源码分析(ViewGroup篇)

    上节我们大致了解了事件分发机制的内容,大概流程,这一节来分析下事件分发的源代码. 我们先来分析ViewGroup中dispatchTouchEvent()中的源码 public boolean dis ...

  8. Android多线程通信机制

    掌握Android的多线程通信机制,我们首先应该掌握Android中进程与线程是什么. 1. 进程 在Android中,一个应用程序就是一个独立的进程(应用运行在一个独立的环境中,可以避免其他应用程序 ...

  9. Android广播机制的深入学习

    部分内容转载自http://www.cnblogs.com/lwbqqyumidi/p/4168017.html 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者 ...

随机推荐

  1. Appium之连续启动多个应用(APP)

    我们知道Appium应用启动时自带的caps可以先行启动某个应用(基于appPackage和appActivity),那么如何用其连续启动多个应用呢? 这里就需要用到start_activity()方 ...

  2. Understanding String Table Size in HotSpot

    In JDK-6962930[2], it requested that string table size be configurable.  The resolved date of that b ...

  3. iperf 指令

    1. 测试UDP丢包率 30个现成以5Mbps速度测试60s iperf -u -c 目的IP -b 5M -P 30 -t 60 测试TCP丢包率 iperf -c 目的IP -b 5M -P 30 ...

  4. 为Visual Studio添加一个“编码的UI测试生成器”的快捷方式

    在添加CodedUI测试用例时,经常需要查看捕获控件的属性.按照常规的方式,只有在添加一个全新的CodedUI编码测试时才能查看捕获控件的属性,这样很不方便. 下面介绍在Visual Studio工具 ...

  5. CSharp读取json配置文件内容

    步骤 读取配置文件转换成字符串,代码如下 string contents = System.IO.File.ReadAllText("config.json"); 注意:该语句会抛 ...

  6. ASP.net 居中

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs& ...

  7. 基于ASP.NET的MVC框架下的MvcPaper分页控件的使用技术

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using Webdiyer. ...

  8. 开发者常用的十款Chrome插件

    本文是稀土掘金投稿,虽然其中有倔金的私货,是篇推广文,但我看过后认为内容确实不错,有些好插件还是第一次知道,对我很有帮助,考虑过后还是决定推荐给大家,最近我比较关注各种提高开发效率的工具与技巧,今后看 ...

  9. “全栈2019”Java异常第四章:catch代码块作用域详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  10. java中的引用类型 部分讲解

    所谓的引用类型 类--接口--数组--枚举 [01--Scanner类] Scanner 这个类是用于键盘输入 它的格式为 类型  对象名称 =  new  类型(): 它的操作格式  对象名.nex ...