文档章节

ANR简介以及解决方案

snowdream
 snowdream
发布于 2016/03/01 11:00
字数 659
阅读 5
收藏 0
点赞 1
评论 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
2015-1-31 阿里技术沙龙 - Android应用性能优化实践

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

杨辉的个人博客
2015/02/01
0
0
深入理解ANR

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

蓝灰_q
2017/12/07
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
02、默默无闻的 Service (一):Service概述

Service.png 版权声明:本文为博主原创文章,未经博主允许不得转载 PS:转载请注明出处 作者: TigerChain 地址: http://www.jianshu.com/p/1443fa4036dc 本文出自 TigerChain 简书 Android ...

TigerChain
2017/10/24
0
0
默默无闻的 Service (一):Service概述

Service.png 版权声明:本文为博主原创文章,未经博主允许不得转载 PS:转载请注明出处 作者: TigerChain 地址: www.jianshu.com/p/1443fa403… 本文出自 TigerChain 简书 Android 系列 教程...

TigerChain
2017/10/24
0
0
Android 异步加载解决方案

Android的Lazy Load主要体现在网络数据(图片)异步加载、数据库查询、复杂业务逻辑处理以及费时任务操作导致的异步处理等方面。在介绍Android开发过程中,异步处理这个常见的技术问题之前,...

Pandora
2012/08/14
0
1
20151212 SQL Server Saturday 广州场

2015年12月12日(星期六),20余位 SQL Server 技术粉丝聚集在微软广州办公室。 本次活动有4个主题分享: 主题1:SQL Server 2016技术初探--大数据时代下的新型数据库产品 林默 讲师简介:微...

jimshu
2015/12/12
0
0
Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)

前言 在 开发中,性能优化策略十分重要 因为其决定了应用程序的开发质量:可用性、流畅性、稳定性等,是提高用户留存率的关键 本文全面讲解性能优化中的所有知识,献上一份 性能优化的详细攻...

Carson_Ho
05/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JAVA 三种WebService 规范

JAVA 中共有三种WebService 规范,分别是JAX-WS(JAX-RPC)、JAXM&SAAJ、JAX-RS。 1. Jaxws(掌握) JAX-WS 的全称为 Java API for XML-Based Webservices ,早期的基于SOAP 的JAVA 的Web 服务...

onedotdot
22分钟前
0
0
将博客搬至CSDN

将博客搬至CSDN

xpbob
23分钟前
0
0
TensorFlow 拟合异或 one-hot方式

增加隐含层数目 之前是按照计算出的数值按照0.5分为0和1,现在是算出向量,用维度较大的作为结果 import tensorflow as tfimport numpy as np# 网络结构:2维输入 --> 2维隐藏层 --> ...

阿豪boy
26分钟前
0
0
Aidl进程间通信详细介绍

目录介绍 1.问题答疑 2.Aidl相关属性介绍 2.1 AIDL所支持的数据类型 2.2 服务端和客户端 2.3 AIDL的基本概念 3.实际开发中案例操作 3.1 aidl通信业务需求 3.2 操作步骤伪代码 3.3 服务端操作...

潇湘剑雨
41分钟前
0
0
python爬虫日志(3)下载图片

import urlliburl='https://xxx.jpg'#图片地址res=urllib.request.urlopen(url)#此函数用于对url的访问data=res.read() #字节流with open(r'D:\1.jpg',"wb") as code: c...

茫羽行
58分钟前
0
0
vue中$emit的用法

1、父组件可以使用 props 把数据传给子组件。 2、子组件可以使用 $emit 触发父组件的自定义事件。 vm.$emit( event, arg ) //触发当前实例上的事件 vm.$on( event, fn );//监听event事件后运...

JamesView
今天
0
0
bash审计系统搭建

step1:使用saltstack工具bash部署>>>>>> # salt -N clienta state.sls audit step2:安装elasticsearch>>>>>> 注意: 1.不能以root用户进行启动,需要创建用户,并对解压的elasticsearch目录赋......

硅谷课堂
今天
0
0
Linux sar性能分析

Linux使用sar进行性能分析 sar简介 sar命令常用格式 sar常用性能数据分析 整体CPU使用统计-u 各个CPU使用统计-P 内存使用情况统计-r 整体IO情况-b 各个IO设备情况-d 网络统计-n sar日志保存-...

易野
今天
0
0
用 Python 实现打飞机,让子弹飞吧!

所用技术和软件 python 2.7 pygame 1.9.3 pyCharm 准备工作 安装好 pygame 在第一次使用 pygame 的时候,pyCharm 会自动 install pygame。 下载好使用的素材。 技术实现 初始化 pygame 首先要...

猫咪编程
今天
0
0
MySQL的行锁和表锁

简单总结一下行锁和表锁。 行锁 每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 表锁 每次操作锁住整张表。开销小,加锁快;不会出...

to_ln
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部