ANR简介以及解决方案

同步发布在: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;
    
  2. 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 中文简介

时间: 2024-11-03 12:10:22

ANR简介以及解决方案的相关文章

android程序,eclipse没报错,但是运行会意外停止

问题描述 android程序,eclipse没报错,但是运行会意外停止 本人刚开始学习android,跟着书写了个程序,这个程序是会有一个东西随着手指拖动而移动,编译完没有问题,但是在手机上运行的时候却是意外停止,错误显示在了MainActivity的第27行,我真不知道哪里错,代码和书上写的一模一样,求大神指导 MainActivity的代码: package com.example.test34; import android.app.Activity; import android.os.

alert-点击提交按钮的时候没有反应,麻烦大神帮忙看一下是什么问题

问题描述 点击提交按钮的时候没有反应,麻烦大神帮忙看一下是什么问题 <!-- .STYLE1 {color: #FF0000} --> ? function check() { if (document.FORM10.zh.value=="") { alert("用户名必填!"); document.FORM10.zh.focus(); return false; } FORM10.submit(); } 信息录入 账号: 密码: 姓名: 科室: &qu

java线程-java中的多线程?线程的并发问题

问题描述 java中的多线程?线程的并发问题 多线程具体代表java中程序的什么?它指的实际功能上的什么情况?详细求解 解决方案 多线程和进程的关系详解: 1.当我们运行QQ程序时,操作系统就会为这个程序创建一个QQ进程(QQ~PCB)并且分配CPU.内存等资源. 2.但这个进程中包含着:发送大型的线程.接受文件的线程.发送文字信息的线程.发送文字信息的线程等多个不同功能的线程. 因而我们才能一边发送文件,一边发送文字信息同时操作.这些线程都共享着QQ进程中的CPU.内存等资源. 总结:所以说进

android 4高级编程-出现unfortunately,Earthquake has stopped

问题描述 出现unfortunately,Earthquake has stopped 下面是LogCat,请大牛们给看看 07-10 07:44:45.008: I/dalvikvm(981): threadid=3: reacting to signal 3 07-10 07:44:45.028: I/dalvikvm(981): Wrote stack traces to '/data/anr/traces.txt' 07-10 07:44:45.198: D/AndroidRuntime

急!B/S的袖珍库存管理系统

问题描述 必须是B/S模式!只要有进库,出库,查看库存量,统计图形报表啥的,能实现整个库存管理完整流程就行!最好用SQLSERVER2000数据库和JAVA语言!其他的数据库限ACCESS.mysql.oracle中的一种.要部署在一个小小油厂的小型办公局域网中供办公室内的人使用.我QQ52542947,认证信息:B/S库存管理long5973@163.com求完整源代码.数据库文件及部署操作使用文档,万分感谢哈!可上传主要功能页面截图及系统简介DEMO 解决方案 解决方案二:你是要买呢?还是.

ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用

原文:ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用 文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-ef-6-get-started-model.html  上一节:ASP.NET MVC5 + EF6 入门教程 (5) Model和Entity Framework 下一节:ASP.NET MVC5 + EF6 + Bootstrap3 (7) Bootstrap的栅格系统 源码下载:点我下载

sql语句-sql中怎么写视图,统计科室人数

问题描述 sql中怎么写视图,统计科室人数 具体是这样的, ?1.门诊科室列表视图 科室代码(ksdm),科室名称(ksmc),科室类别(kslb)科室人数(ksrs) 科室代码,科室名称,科室类别在表ms_ghks里面有,可以直接取,科室人数的话要自己统计,其中在ms_ysks里面有科室代码(ksdm)和医生代码(ysdm),就是要统计下各个科室医生的数量 请问这个视图怎么写啊 2.科室内医生信息视图 一个科室内可以有多个医生,根据ksdm去查询该表 科室代码(ksdm),医生代码(ysdm)

FileUpload选择图片即时显示在一个Div中,求解答

问题描述 <tr><tdclass="t1">封面</td><tdclass="t2"style="height:150px;"><asp:ImageID="Image1"runat="server"/><asp:FileUploadID="fudIamge"runat="server"/><

C#双色球彩票问题

问题描述 模拟中国福利彩票"双色球"的开奖过程.先逐一产生出6个红球号码(号码范围1~33),再开出1个篮球号码(号码范围1~16),并将开奖结果显示出来.如下列所示:中国福利彩票"双色球"第2014038期开奖过程:开出的第1个红球号码为:5开出的第2个红球号码为:2开出的第3个红球号码为:17开出的第4个红球号码为:10开出的第5个红球号码为:21开出的第6个红球号码为:14开出的篮球号码为:9本期中奖号码为:2510141721+9求给的代码简介明了 解决方案