ANR (Application Not Responding)  

ANR定义:在Android上,假设你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框。这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户能够选择“等待”而让程序继续执行。也能够选择“强制关闭”。

所以一个流畅的合理的应用程序中不能出现anr,而让用户每次都要处理这个对话框。因此,在程序里对响应性能的设计非常重要,这样系统不会显示ANR给用户。

默认情况下。在android中Activity的最长运行时间是5秒,BroadcastReceiver的最长运行时间则是10秒。

第一:什么会引发ANR?

在Android里。应用程序的响应性是由Activity Manager和WindowManager系统服务监视的 。当它监測到下面情况中的一个时,Android就会针对特定的应用程序显示ANR:

1.在5秒内没有响应输入的事件(比如。按键按下,屏幕触摸)

2.BroadcastReceiver在10秒内没有运行完成

造成以上两点的原因有非常多。比方在主线程中做了非常耗时的操作,比方说是下载,io异常等。

潜在的耗时操作,比如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完毕。

然而,不是说你的主线程堵塞在那里等待子线程的完毕——也不是调用 Thread.wait()或是Thread.sleep()。

替代的方法是,主线程应该为子线程提供一个Handler,以便完毕时可以提交给主线程。以这样的方式设计你的应用程序。将能保证你的主线程保持对输入的响应性并能避免因为5秒输入事件的超时引发的ANR对话框。

第二:怎样避免ANR?

1、执行在主线程里的不论什么方法都尽可能少做事情。

特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。

(能够採用又一次开启子线程的方式。然后使用Handler+Message的方式做一些操作,比方更新主线程中的ui等)

2、应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(由于 BroadcastReceiver的生命周期短),替代的是,假设响应Intent广播须要运行一个耗时的动作的话,应用程序应该启动一个 Service。(此处须要注意的是能够在广播接受者中启动Service,可是却不能够在Service中启动broadcasereciver,关于原因兴许会有介绍。此处不是本文重点)

3、避免在Intent Receiver里启动一个Activity。由于它会创建一个新的画面,并从当前用户正在执行的程序上抢夺焦点。

假设你的应用程序在响应Intent广 播时须要向用户展示什么。你应该使用Notification Manager来实现。

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

android ANR产生原因和解决的方法的更多相关文章

  1. android ANR产生原因和解决办法

    转自http://blog.sina.com.cn/s/blog_618199e60101kvbl.html ANR (Application Not Responding) ANR定义:在Andro ...

  2. android ANR产生原因和解决办法【转】

    ANR (Application Not Responding) ANR定义:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(AN ...

  3. [转]android ANR产生原因和解决办法

    ANR (Application Not Responding) ANR定义:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(AN ...

  4. Android Eclipseproject开发中的常见调试问题(二)android.os.NetworkOnMainThreadException 异常的解决的方法

    android.os.NetworkOnMainThreadException 异常的解决的方法. 刚开是把HttpURLConnectionnection 打开连接这种方法放在UI线程里了,可能不是 ...

  5. Ubuntu使用adb连接android手机失败unknown的解决的方法

    Ubuntu使用adb连接android手机失败unknown的解决的方法   Ubuntu下通过USB数据线连接G11手机后,adb可能无法识别到设备.依照一下步骤能够解决此问题. 1.在termi ...

  6. 兔子--R.java丢失原因及解决的方法

    R.jar丢失原因: a:eclipse指向的adk路径有中文,或者是workspace路径有中文 b:xml文件里有错误或者引用的资源不存在 c:xml或者drawable下资源文件不能够有大写字母 ...

  7. android 项目R文件丢失解决的方法

    R文件丢失的原因有非常多,这里提供几种解决的方法: 1.  选中项目,点击 Project - Clean , 清理一下项目. 2. 选中项目,右键 选择 Android Tools  - Fix P ...

  8. 【解决】缺少libstdc++.so.6库的原因及解决的方法

    问题原因: 系统是64bit,该库是32bit的,在64bit系统上安装32bit库 解决的方法: 1. 查看哪个安装包包括该库:yum provides libstdc++.so.6    libs ...

  9. Android ANR(应用无响应)解决分析【转】

    本文转载自:https://blog.csdn.net/u014630142/article/details/81709459 来自: http://blog.csdn.net/tjy1985/art ...

随机推荐

  1. [笔记]《算法图解》第十章 K最近邻算法

    K最近邻算法 简称KNN,计算与周边邻居的距离的算法,用于创建分类系统.机器学习等. 算法思路:首先特征化(量化) 然后在象限中选取目标点,然后通过目标点与其n个邻居的比较,得出目标的特征. 余弦相似 ...

  2. Solr 配置连接数据库

    前面我们将solr安装并创建了core同时也配置可IK分词器,接下来我们通过配置连接Mysql数据库并把数据导入到solr(使用ik分词器). 1.配置managed-schema文件 Request ...

  3. maven学习(六)——在别的项目中引用通过Maven安装生成的项目的jar包

    1.新建HelloFriend项目,同时建立Maven约定的目录结构和pom.xml文件 HelloFriend    | --src | -----main | ----------java | - ...

  4. Junit单元测试--01

    如何编写单元测试 燕双龙 一 单元测试简介 单元测试是代码正确性验证的最重要的工具,也是系统测试当中最重要的环节.也是唯一需要编写代码才能进行测试的一种测试方法.在标准的开发过程中,单元测试的代码与实 ...

  5. Android获取系统时间yyyyMMddHHmmssSSS

    代码改变世界 public String testTime1() throws ParseException { String DEFAULT_TIME_FORMAT = "yyyy-MM- ...

  6. Pointcut is not well-formed: expecting 'name pattern' at character position 53

    报错内容: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataso ...

  7. POJ 2728 Desert King(最优比例生成树 二分 | Dinkelbach迭代法)

    Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 25310   Accepted: 7022 Desc ...

  8. Codeforces Round #316 (Div. 2) B 贪心

    B. Simple Game time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  9. 【07】react 之 生命周期

    阅读目录(Content) 实例化 getDefaultProps getInitialState componentWillMount render componentDidMount 存在期 co ...

  10. IOS 滑动指示导航栏 渐变

    关于导航栏渐变,本人在写APP的时候,发现了各路大神各现其通,其实我觉得这个是个很简单的问题,不需要搞得那么麻烦,对个项目要求整齐来说,一般会建一个工具类,自定义View,各个同事需要的时候,直接调用 ...