ANR相关问题分析

什么是ANR

如果有一段时间程序点击不够灵敏,系统就会向用户显示一个对话框,而这个对话框的内容就是anr(Application not responding)
让用户选择等待程序继续运行,同时也可以选择关闭对话框终止程序运行

结果就是非常影响用户体验

Activity最长时间五秒

广播最长的执行时间10秒

造成ANR的主要原因

这篇文章分析了源码,ANR原理分析

简单说就是主线程做了耗时操作,无法在规定时间内完成,造成ANR

主要原因有以下两点:

一、主线程被IO操作(4.0之后网络IO不允许在主线程中运行)阻塞

二、主线程中存在耗时的计算,比如一些网络数据读取

android中的哪些操作是在主线程?

  1. Activity的所有生命周期回调都是执行在主线程

  2. Service默认执行在主线程

  3. BroadCastReceiver的onReceive回调是执行在主线程

  4. 没有使用子线程的looper的Handler的handleMessage方法和post(Runnable)也是执行在主线程,很好理解

  5. AsyncTask的方法里除了doInBackground,其他都是执行在主线程中

如何解决ANR

  1. 使用AsyncTask 处理耗时IO操作

  2. 使用Thread或者HandlerThread提高优先级
    可以使用Thread和HandlerThread来处理耗时操作,区别是HandlerThread自带Looper,可以创建Handler发送消息

  3. 使用Handler处理工作线程的耗时任务

  4. 在Activity的onCreate和onResume方法中尽量避免耗时的代码

posted @ 2022-07-09 11:52  cfdroid  阅读(84)  评论(0编辑  收藏  举报