ANR简介以及解决方案

简介: 同步发布在:http://snowdream.github.io/blog/2016/02/25/anr-introduce-and-solutions/ ANR ANR,英文全称为 Application Not Responding,即应用无响应。 具体表现,弹出一个应用无响应的窗口,

同步发布在: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操作/耗时操作全部封装成异步任务,放进子线程。

  2. 工具辅助检测

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

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

相关文章
|
8月前
|
人工智能 前端开发 数据挖掘
真实场景|芯片研发平台如何真正实现一体化混合云调度?
AI芯片设计公司X面临多项目并行研发的高并发算力缺口,本地集群资源紧张。为解决混合调度和成本可控的难题,X公司引入MemVerge的EDA混合云研发平台。该平台统一调度本地与云端资源,无缝兼容现有工作流程,智能动态扩缩容,优化成本。例如,在前端回归验证中,3000个job通过优先使用本地2500核集群,剩余1000个job自动调度至云端运行,确保高效处理。对于新项目紧急任务,平台智能分配云上资源,并收集运行数据优化后续调度。
217 4
|
前端开发 Java 编译器
【前端学java】如何从前端视角快速学习Maven
【8月更文挑战第12天】如何从前端视角快速学习Maven
202 2
【前端学java】如何从前端视角快速学习Maven
|
数据挖掘 索引 Python
Python数据分析篇--NumPy--入门
Python数据分析篇--NumPy--入门
203 0
|
小程序 JavaScript Java
驾校预约|驾校预约小程序|基于微信小程序的驾校预约平台设计与实现(源码+数据库+文档)
驾校预约|驾校预约小程序|基于微信小程序的驾校预约平台设计与实现(源码+数据库+文档)
224 0
|
物联网 监控 API
IoT平台设备标签功能和规则引擎组合最佳实践
助力设备管理,多维度检索,GIS展现
4121 0
|
iOS开发 开发者
苹果 iOS App Store 上架操作流程详解:从开发者账号到应用发布
苹果 iOS App Store 上架操作流程详解:从开发者账号到应用发布
|
Linux Android开发 数据安全/隐私保护
哪家好用?四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk(二)
哪家好用?四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk(二)
805 0
|
存储 弹性计算 分布式计算
阿里云服务器租赁费用(2022新版租赁费用及活动报价更新)
阿里云服务器租赁费用来了,本文更新了2022阿里云服务器租赁费用,包括特惠活动云服务器优惠价格及官方定价,云服务器1核2G1M带宽配置24.78元3个月1年356.83元、共享型2核4G服务器最低仅需413.86元1年、4核8G服务器765.94元1年、8核16G服务器1472.26元1年,独享型2核4G服务器最低仅需466.22元1年、4核8G服务器856.94元1年、8核16G服务器1635.74元1年。更多阿里云服务器热门配置活动报价及云服务器租赁费用及活动报价见下文。
3165 0
阿里云服务器租赁费用(2022新版租赁费用及活动报价更新)
|
监控 网络协议 应用服务中间件
下一篇
开通oss服务