文档章节

ANR简介以及解决方案

snowdream
 snowdream
发布于 2016/03/01 11:00
字数 659
阅读 6
收藏 0

同步发布在:http://snowdream.github.io/blog/2016/02/25/anr-introduce-and-solutions/

ANR

ANR,英文全称为 Application Not Responding,即应用无响应。 具体表现,弹出一个应用无响应的窗口,也可能不弹出直接闪退。

ANR的类型

ANR一般有三种类型:

  1. KeyDispatchTimeout(5 seconds) --主要类型 按键或触摸事件在特定时间内无响应
    定义参考:ActivityManagerService.java
// How long we wait until we timeout on key dispatching.
static final int KEY_DISPATCHING_TIMEOUT = 5*1000;
  1. BroadcastTimeout(前台 10 seconds,后台 60 seconds) BroadcastReceiver在特定时间内无法处理完成 定义参考:ActivityManagerService.java
// How long we allow a receiver to run before giving up on it.
static final int BROADCAST_FG_TIMEOUT = 10*1000;
static final int BROADCAST_BG_TIMEOUT = 60*1000;
  1. ServiceTimeout(前台 20 seconds,后台 200 seconds) --小概率类型 Service在特定的时间内无法处理完成 定义参考:ActiveServices.java
// How long we wait for a service to finish executing.
static final int SERVICE_TIMEOUT = 20*1000;
// How long we wait for a service to finish executing.
static final int SERVICE_BACKGROUND_TIMEOUT = SERVICE_TIMEOUT * 10;

ANR的原因

这里不得不介绍下Android的单线程模型。

当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。

** ANR的原因只有一个: 那就是把IO操作/耗时操作放在了主线程,导致主线程无法及时处理份内的事情(诸如:响应按键,点击事件,刷新界面等),超过了预定时间阀值,最终导致ANR。**

ANR的解决方案

分析ANR Trace文件 (被动方案) 

应用内通过UncaughtExceptionHandler检测到全局崩溃时,上传ANR Trace文件到后台服务器,归类分析。

ANR Trace文件的路径通常是:data/anr/traces.txt 但是文件名可能稍有不同。因此,建议上传data/anr/下所有文件。

具体上传方法不展开,请自行百度,或者参考:在Android中自定义捕获Application全局异常,可以替换掉系统的强制退出对话框(很有参考价值与实用价值)

预防ANR (主动方案) 

  1. 同步改异步

将IO操作/耗时操作全部封装成异步任务,放进子线程。

  1. 工具辅助检测

通过BlockCanary检测耗时操作,通过优化算法,放进子线程等方法进行优化。

具体使用方法请参考:BlockCanary 中文简介

© 著作权归作者所有

共有 人打赏支持
snowdream

snowdream

粉丝 20
博文 12
码字总数 6591
作品 15
海淀
程序员
[译] 如何用 Android vitals 解决应用程序的质量问题

原文地址:How to fix app quality issues with Android vitals 原文作者:Wojtek Kaliciński 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:LeeSniper 校对者:D...

Android_开发者
07/13
0
0
android MultiDex multidex原理原理下遇见的N个深坑(二)

android MultiDex 原理下遇见的N个深坑(二) 这是在一个论坛看到的问题,其实你不知道MultiDex到底有多坑。 不了解的可以先看上篇文章:android MultiDex multidex原理(一) 解决和遇到的其...

DJY1992
2016/04/15
0
0
深入理解ANR

关于ANR,以前只知道Activity、BroadCastReceiver、Service三种组件的ANR时限、一般采用哪些方式避免ANR、以及通过data/anr/traces.txt去分析ANR原因,感觉好像这就够用了。 但是,前几天看源...

蓝灰_q
2017/12/07
0
0
2015-1-31 阿里技术沙龙 - Android应用性能优化实践

2015-1-31 阿里技术沙龙 - Android应用性能优化实践 杨辉的个人博客2015-02-01217 阅读 技术Android应用性能优化 周末跑去深圳参加了一场阿里主持的技术沙龙,主题是《如何构建高可用的APP》...

杨辉的个人博客
2015/02/01
0
0
Android两种常见错误(ANR和FC)解决办法

ANR(Activity Not Respone)(无响应) 先介绍下Main线程(也称为UI线程、主线程) 功能: 1.创建UI控件 2.更新UI控件状态 3.事件处理 限制:Main线程不建议有超过5秒的事件 出现条件: 当用户输...

Stephen_Wen
2014/11/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Redis常用命令

keys 我把这个命令放在第一位,是因为笔者曾经做过的项目,以及一些朋友的项目,都因为使用keys这个命令,导致出现性能毛刺。这个命令的时间复杂度是O(N),而且redis又是单线程执行,在执行k...

谢思华
35分钟前
2
0
关于css宽度分离

所谓宽度分离就是width 属性不与影响宽度的 padding/border(有时候包括 margin)属性共存 例如: .box{width:200px;padding:20px;border:1px solid;} 为何要做宽度分离 一说到分离就是为了好...

莫西摩西
46分钟前
1
0
Linux常用命令

###############常用命令说明############################## cat /proc/version 显示内核的版本 mv dir1 new_dir 重命名/移动 一个目录 rm -rf a.txt b.txt c.txt 删除多个文件 chmod 777 ......

lyle_luo
53分钟前
2
0
全国地区代码科普

全国地区代码表 天津市 地区代码 地区名称 1100 天津市 辽宁省 地区代码 地区名称 2210 沈阳市 2210 法库县 2210 康平县 2210 辽中县 2210 新民市 2220 大连市 2222 普兰店市 2223 庄河市 22...

恋码之子
53分钟前
1
0
DbForge Schema Compare for MySQL入门教程:生成比较报告

【dbForge Schema Compare for MySQL下载】 当架构比较完成后,您可以生成比较报告以保留架构更改的记录。 1. 在“Comparison” 菜单中,单击“Generate Comparison Report” 。将打开“Gen...

Miss_Hello_World
54分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部