重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
ANR是Application Not Responding的简称,主要是说应用程序出现无响应的情况。在这个情况出现的时候同时在手机界面会弹出响应的对话框,提示应用程序无响应
创新互联建站是一家专注于做网站、网站建设与策划设计,白银网站建设哪家好?创新互联建站做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:白银等地区。白银做网站价格咨询:13518219792
ANR的几种类型:
当运行指定的APP,如果Android系统检测到符合下边的几种条件那就会弹出应用程序无响应的界面。
1)按键超时:Android默认的响应时间是5s,如果一个触屏事件超过5s,那么就会发生此现象。
2)广播超时:广播的默认响应时间是10s,如果一个广播在10s之内还美柚执行完,那么就会出现此现象。
3)服务超时:服务的默认响应事件是20s,如果请求的服务在20s内失败,那么就会发生此现象。
ANR事件与异常的区别
ANR事件是由于一些操作的原因或者是反应事件较慢会出现程序无响应的情况,而异常是程序由于代码或者是一些其他的原因出现程序停止运行的情况,这两种情况的性质是完全不一样的。
ANR (“Application Not Responding”),意思是”应用没有响应“。
在如下情况下,Android会报出ANR错误:
1.主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件。
2.BroadcastReceiver 没有在10秒内完成返回。
通常情况下,下面这些做法会导致ANR:
1、在主线程内进行网络操作。
2、在主线程内进行一些缓慢的磁盘操作(例如执行没有优化过的SQL查询)。
应用应该在5秒或者10秒内响应,逻辑应该是:
1. new出一个新的线程,进行数据请求。
2. 获取数据后,调用handler.sendMessage方法。
3. 在handler的handle()方法中更新UI。
Android ANR是程序无法响应的问题,可以由以下方式解决:
将一些消耗时间的代码放到Handler类里面去执行,相当于另外开一个线程,不会阻塞主线程,从而避免引发ANR的问题,如下代码:
private Handler handler = new Handler(); //新建一个handler类
private Runnable myRunnable= new Runnable() { //新建一个Runnable来开设一个线程
public void run() {
if (run) {
handler.postDelayed(this, 1000);
count++;
}
tvCounter.setText("Count: " + count); //里面来执行一些控件的更新
}
};
应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。
ANR: ANR全称是Application No Responding,翻译过来就是程序无响应, 他是Android独有的概念。定位和解决以及避免ANR是我们需要必备的技能。
1: ANR产生的原因:
Android的UI线程响应超时就会引起ANR, 主要体现在两种情况中:
2:典型的ANR场景:
1: 当一个ANR的问题产生, 我们无法确认是ANR watchdog或者是crash。每一种类型的问题的产生都有不同的影响范围和表现形态, 一般冻屏, 一段时间后程序退出, 这种情况的产生都是ANR。在我们的AP Log中,ANR的filter字段一般有这几种: ANR low_memory slow_operation. 我们根据这些关键字搜索到发生ANR的地方:
2: ANR log日志在系统的data/anr目录下, 我们将所有的anr log日志pull出来。
3: 打开这个文件