ANR机制
1、什么是ANR(Application Not Responding)
在Android中,应用程序的响应性是由ActivityManager和WindowManager系统服务监视的。当监测到以下情况中的一个时,Android就会针对特定的应用程序显示ANR
A:KeyDispatchTimeout(5 seconds) --主要类型
按键或触摸事件在特定时间内无响应
B:BroadcastTimeout(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机制的更多相关文章
- handler与anr机制
1. handler 参考资料:http://blog.csdn.net/ly502541243/article/details/52062179/ 首先说明Android的两个特性: 1. 只能在主 ...
- 谈谈 ANR 之 Service 超时
1. 核心源码 关键类 路径(/frameworks/base/) ActiveServices.java services/core/java/com/android/server/am/Activ ...
- Android ANR优化 2
在实际情况中,当Android项目的用户量特别大时候,一些细小的问题也会被放大,ANR问题就是一个典型的例子. 一些ANR问题只会发生在用户实际使用的情景,当系统资源比较紧张等一些特殊情况下才会遇到, ...
- ANR问题分析实例
ANR监测机制包含三种: Service ANR,前台进程中Service生命周期不能超过20秒,后台进程中Service的生命周期不能超过200秒. 在启动Service时,抛出定时消息SERVIC ...
- 教你如何 分析 Android ANR 问题
ANR介绍 ANR 的全称是 Application No Responding,即应用程序无响应,具体是一些特定的 Message (Key Dispatch.Broadcast.Service) ...
- Android应用博客目录
应用有很多,开个博客都放进来方便查找,也方便修改 1 语言类: 1.1 JAVA 基础语言知识JAVA Collection与Collections,Array与Arrays的区别 JAVA练手--S ...
- Android事件分发机制浅谈(二)--源码分析(ViewGroup篇)
上节我们大致了解了事件分发机制的内容,大概流程,这一节来分析下事件分发的源代码. 我们先来分析ViewGroup中dispatchTouchEvent()中的源码 public boolean dis ...
- Android多线程通信机制
掌握Android的多线程通信机制,我们首先应该掌握Android中进程与线程是什么. 1. 进程 在Android中,一个应用程序就是一个独立的进程(应用运行在一个独立的环境中,可以避免其他应用程序 ...
- Android广播机制的深入学习
部分内容转载自http://www.cnblogs.com/lwbqqyumidi/p/4168017.html 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者 ...
随机推荐
- [转]How to Clean the Global Assembly Cache
本文转自:https://www.techwalla.com/articles/how-to-clean-the-global-assembly-cache The Global Assembly C ...
- 23 DesignPatterns学习笔记:C++语言实现 --- 1.4 Builder
23 DesignPatterns学习笔记:C++语言实现 --- 1.4 Builder 2016-07-21 (www.cnblogs.com/icmzn) 模式理解
- [label][paypal] Paypal 支付页面的语言显示问题
答复 Frank 通过 Email2014-11-12 02:01 上午 您好 感谢您联系PayPal商家技术支持中心. PayPal登陆页面的语言是PayPal服务器根据以下各种因素来自动判断的:1 ...
- ArcGIS(批量)删除属性字段
ArcGIS下删除属性字段有两种方式:① 单个删除:② 批量删除. 单个删除 批量删除 尽管如此,ArcGIS桌面软件在属性字段的编辑上并不太方便,所以我们自己做了一些工具辅助平时的内业处理工作.(* ...
- Java Web系列:Hibernate 基础
从以下5个方面学习hibernate ORM. (1)配置文件:hibernate.cfg.xml XML文件和hibernate.properties属性文件 (2)实体映射:1对多.多对多 (3) ...
- ffmpeg学习(一)——在window7下编译ffmpeg
FFmpeg是一个开源免费跨平台的视频和音频流项目,它提供了录制.转换以及流化音视频的完整解决方案.本文作者将尝试使用该库实现一个可适应复杂网络环境的, 支持标准rtsp协议的流媒体服务器.由于Vis ...
- 调用kylin的restAPI接口构建cube
调用kylin的restAPI接口构建cube 参考:http://kylin.apache.org/docs/howto/howto_build_cube_with_restapi.html 1. ...
- Xamarin.Android RelativeLayout
初次接触Xamarin.Android. 由于国内Xamarin的资料少见,我大多参考JAVA原生代码,慢慢摸索过来. 我把摸索出来的结果广而告之,希望后来人能少走一点弯路,也希望你也能做出一份贡献. ...
- BASE64编码乱码问题的浅层分析与解释
本文由作者朱臻授权网易云社区发布. 1问题案例 曾在开发过程中,我们遇到了BASE64编码乱码的问题,该问题的场景如下: 当web前端,将带有中文字符的字符串base64编码后,传到后端.当后端将数据 ...
- FasterRunner在Centos7.6服务器部署
前言: 测试工作,就是要保障软件产品质量,如何保障软件产品质量,是一个博大精深的问题.功能测试,性能测试,接口测试,安全测试等.而在现实的项目过程中,软件版本的快速迭代,给测试的时间会越来越少.特别是 ...