ANR相关问题分析
什么是ANR
如果有一段时间程序点击不够灵敏,系统就会向用户显示一个对话框,而这个对话框的内容就是anr(Application not responding)
让用户选择等待程序继续运行,同时也可以选择关闭对话框终止程序运行
结果就是非常影响用户体验
Activity最长时间五秒
广播最长的执行时间10秒
造成ANR的主要原因
这篇文章分析了源码,ANR原理分析
简单说就是主线程做了耗时操作,无法在规定时间内完成,造成ANR
主要原因有以下两点:
一、主线程被IO操作(4.0之后网络IO不允许在主线程中运行)阻塞
二、主线程中存在耗时的计算,比如一些网络数据读取
android中的哪些操作是在主线程?
-
Activity的所有生命周期回调都是执行在主线程
-
Service默认执行在主线程
-
BroadCastReceiver的onReceive回调是执行在主线程
-
没有使用子线程的looper的Handler的handleMessage方法和post(Runnable)也是执行在主线程,很好理解
-
AsyncTask的方法里除了doInBackground,其他都是执行在主线程中
如何解决ANR
-
使用AsyncTask 处理耗时IO操作
-
使用Thread或者HandlerThread提高优先级
可以使用Thread和HandlerThread来处理耗时操作,区别是HandlerThread自带Looper,可以创建Handler发送消息 -
使用Handler处理工作线程的耗时任务
-
在Activity的onCreate和onResume方法中尽量避免耗时的代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库