ANR

2020-02-12  本文已影响0人  couriravant

1.1 简介

ANR全称:Application Not Responding,也就是应用程序无响应。

1.2 原因

Android系统中,ActivityManagerService(简称AMS)和WindowManagerService(简称WMS)会检测App的响应时间,如果App在特定时间无法相应屏幕触摸或键盘输入时间,或者特定事件没有处理完毕,就会出现ANR。

以下四个条件都可以造成ANR发生:

InputDispatching Timeout:5秒内无法响应屏幕触摸事件或键盘输入事件
BroadcastQueue Timeout :在执行前台广播(BroadcastReceiver)的onReceive()函数时10秒没有处理完成,后台为60秒。
Service Timeout :前台服务20秒内,后台服务在200秒内没有执行完毕。
ContentProvider Timeout :ContentProvider的publish在10s内没进行完。

一些典型的ANR 问题场景

1)最常见错误,( 主线程阻塞或主线程数据读取)UI线程等待其它线程释放某个锁,导致UI线程无法处理用户输入;

解决办法:避免死锁的出现,使用子线程来处理耗时操作或阻塞任务。尽量避免在主线程query provider、不要滥用SharePreferenceS

2)游戏中每帧动画都进行了比较耗时的大量计算,导致CPU忙不过来;

3)Web应用中,网络状态不稳定,而界面在等待网络数据;

4)UI线程中进行了一些磁盘IO(包括数据库、SD卡等等)的操作,在个别设备上因为硬件损坏等原因阻塞住了;

5)手机被其他App占用着CPU,自己获取不到足够的CPU 时间片,纯属误伤。
6)避免加载大图片引起内存不足导致 ANR;
7)避免内存泄露引起的 ANR。(应用内内存泄漏导致的响应不及时。)

refer: https://www.jianshu.com/p/1f720fef3cf0

上一篇 下一篇

猜你喜欢

热点阅读