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. Python获取程序运行目录和脚本目录

    Python获取程序运行目录和脚本目录 import os import sys #获取脚本所在目录 print os.path.split( os.path.realpath( sys.argv[0 ...

  2. ABC128F Frog Jump

    题目链接 题目大意 给定一个长为 $n$ 的数组 $s$,下标从 $0$ 开始.$ 3 \le n \le 10^5$,$-10^9 \le s_i \le 10^9$,$s_0 = s_{n - 1 ...

  3. [HEOI2016/TJOI2016][bzoj4555] 求和 [斯特林数+NTT]

    题面 传送门 思路 首先,我们发现这个式子中大部分的项都和$j$有关(尤其是后面的$2^j\ast j!$),所以我们更换一下枚举方式,把这道题的枚举方式变成先$j$再$i$ $f(n)=\sum_{ ...

  4. SolrCloud在linux上的搭建

    SolrCloud在linux上的搭建 1.环境准备 三台虚拟机的环境准备: 1. 更改主机名 2. 关闭selinux 3. 关闭防火墙 4. 更改主机名与ip地址的映射 5. 时钟同步 6. ss ...

  5. make gif pic

    http://www.cockos.com/licecap/ licecap 1.open licecap 2.record ,make a pic filename,like pic1 3.work ...

  6. 在做展开功能的时候,字体变多了,字体会变大的bug的解决方案

    在没有限制高度的情况下字体会变大,要做展开效果,当然不能限制高度. 解决方案是,加个max-height就可以解决这个问题

  7. gradle ofbiz 16 开发环境搭建

    原 gradle ofbiz 16 开发环境搭建 2017年02月13日 10:59:19 阅读数:2702 1.安装jdk 2.配置jdk环境变量 3.eclipse 安装svn 插件 4.svn下 ...

  8. 【CF1073B】Vasya and Books(模拟)

    题意:给你一个栈里书的编号,每次能捞出栈顶的一本书,每次询问捞出某本编号的书需要捞几次 n<=2e5 思路: #include<cstdio> #include<cstring ...

  9. .NET泛型编程 性能提升工具 List<T>

    原文发布时间为:2009-10-27 -- 来源于本人的百度文章 [由搬家工具导入] 结论  .NET 2.0中的泛型是强有力的,你写的代码不必限定于一特定类型,然而你的代码却能具有类型安全性。泛型的 ...

  10. case when then else 详解

    原文发布时间为:2008-10-15 -- 来源于本人的百度文章 [由搬家工具导入] sql语句判断方法之一 Case具有两种格式。简单Case函数和Case搜索函数。 --简单Case函数 CASE ...