Android性能优化(二)—— ANR

1 简介

ANRApplication Not Responding),程序长时间无响应。系统长时间无法处理某个操作,就会弹出ANR对话框。

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

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

  • InputDispatching Timeout5s内无法响应屏幕触摸事件或键盘输入事件;
  • Service Timeout:前台服务20s内,后台服务在200s内没有执行完毕;
  • BroadcastQueue Timeout:在执行前台广播的onReceive方法时10s没有处理完成,后台为60s
  • ContentProvider TimeoutContentProviderpublish10s内没进行完;

造成以上ANR的首要原因就是在主线程中做了太多的耗时操作,例如读写文件,访问数据库,网络请求等。因此,尽可能的避免在主线程中做耗时操作。

2 ANR分析

MainActivity中生成一个按钮跳转到ANRActivity中,在后者的onCreate()中主线程休眠20s

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
   
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_anr_test);
    // 这是Android提供线程休眠函数,与Thread.sleep()最大的区别是
    // 该使用该函数不会抛出InterruptedException异常。
    SystemClock.sleep(20 * 1000);
}

在进入ANRActivity后黑屏一段时间,再过几秒,弹出了ANR异常:

ANR

日志打印:

2022-06-26 07:57:59.031 559-8280/system_process E/ActivityManager: ANR in com.example.kotlintest (com.example.kotlintest/.ui.MainActivity)
    PID: 8213
    Reason: Input dispatc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值