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广播分为两个方面:广播发送者和广播接收者 ...
随机推荐
- Spring IOC 和 AOP概述
IoC(控制反转,(Inversion of Control):本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,这就叫控制反转,即交给了IoC容器,Spring的IoC容器主要使用DI方 ...
- Oracle EBS Standard Package Function Add User & Resp
Oracle EBS Standard Package Function Add User & Resp. fnd_user_pkg.CreateUser; fnd_user_pkg.AddR ...
- Oracle EBS不能正常启动的解决方案 > Jinitiator 乱码
问题1:使用IE浏览器(IE6 IE7 IE8)可以登录EBS,但在打开EBS的WIN Form界面里,IE自动关闭或报错,或是卡住不动 原因1: oracle EBS自带安装的JInitiator ...
- delphi 10.1 berlin datasnap提交clientdataset.delta报:invalid variant type conversion(类型转换错误)问题的解决
delphi 10.1 berlin datasnap提交clientdataset.delta报:invalid variant type conversion(类型转换错误)问题的解决,需要打这个 ...
- #测试框架推荐# test4j,数据库测试
# 背景 后端都是操作DB的,这块的自动化测试校验的话,是需要数据库操作的,当然可以直接封装方法来操作数据,那么有没有开源框架支持数据操作,让我们关注写sql语句?或者帮我们做mysql的断言呢? # ...
- HTML5 LocalStorage Demo
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- 开源应用框架BitAdminCore:更新日志20180605
索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/coo ...
- Android Dialog 的一些特性
1. Dialog 与 AlertDialog 的区别. AlertDialog 是一种特殊形式的 Dialog.这个类中,我们可以添加一个,两个或者三个按钮,可以设置标题.所以,当我们想使用 Ale ...
- Exp3 免杀原理与实践 20164323段钊阳
网络对抗技术 20164323 Exp3 免杀原理与实践 免杀 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. 要做好免杀,就时清楚杀毒软件(恶意软件检测工具)是如何 ...
- COOKIE的优化与购物车小试
由于经常被抓取文章内容,在此附上博客文章网址:,偶尔会更新某些出错的数据或文字,建议到我博客地址 : --> 点击这里 一 Cookie 的优化 1.1 一般而言,我们设置cookie是在ph ...