一、什么是 ANR?

ANR(Application Not Responding) 是 Android 系统在应用程序主线程(UI
线程)被阻塞超过一定时间后触发的错误机制。此时系统会弹出一个对话框提示用户“应用无响应”,用户可以选择等待或强制关闭应用。

ANR 的触发条件:

  1. 主线程阻塞超过阈值
    1)输入事件(如点击、滑动):5 秒内未处理完成。
    2)BroadcastReceiver:前台广播 10 秒内未完成,后台广播 60 秒内未完成。
    3)Service 启动或绑定:前台 Service 5 秒内未完成onCreate()或onStartCommand()。
  2. 主线程执行耗时操作:例如网络请求、数据库查询、文件读写等。

二、ANR 的根本原因

  • 主线程被阻塞:主线程负责 UI 渲染和事件响应,若执行耗时操作,会直接导致界面卡顿或无响应。
  • 过度复杂的布局或绘制:布局嵌套过深、频繁重绘等。
  • 死锁或过度同步:线程间竞争锁资源,导致主线程等待。

三、如何避免 ANR?

1、主线程只处理 UI 和轻量操作

1)禁止在主线程执行以下操作
a)网络请求(HTTP/HTTPS)。
b) 数据库查询(SQLite)。
c) 大文件读写。
d) 复杂计算(如循环、加密解密)。

2)正确做法:使用子线程(如 Thread、HandlerThread)或异步框架(如 Kotlin 协程、RxJava、AsyncTask)。

2、使用异步框架处理耗时任务
1)Kotlin 协程:
2)Rxjava

3、 优化主线程任务
1)减少布局复杂度:a) 使用 ConstraintLayout 减少嵌套层级;b) 避免 RelativeLayout 或 LinearLayout 的过度嵌套;c) 使用 ViewStub 延迟加载复杂布局。
2)避免过度绘制:使用 Android Studio 的 Layout Inspector 和 GPU 渲染分析工具 检测绘制性能
3)分批处理数据:若需渲染大量数据(如列表),使用分页加载(Paging Library)或增量更新

4、 避免死锁和过度同步
1)减少锁竞争:避免在主线程中等待子线程释放锁。
2)使用线程安全的数据结构:如 ConcurrentHashMap、CopyOnWriteArrayList
3)谨慎使用 synchronized:尽量缩小同步代码块的范围

5、 监控 ANR 并分析日志
1)ANR 日志
a) 系统会在 /data/anr/ 目录下生成 traces.txt 文件,记录 ANR 时的线程堆栈
b) Android 11 及以上版本可通过 adb bugreport 获取更详细的日志

2)第三方监控工具
a) 使用 Firebase Crashlytics、Bugsnag 等工具捕获 ANR 事件。
b) 使用 ANR-WatchDog 库主动检测 ANR。

通过合理设计线程模型、使用现代异步框架,并结合性能分析工具,可显著降低 ANR 的发生概率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/80523.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/80523.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/80523.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构(六)——树和二叉树

一、树和二叉树的定义与存储 1.树的定义 树是一种非线性的数据结构,它是由n个有限结点组成有层次关系的集合 树具有以下特点: (1)每个结点具有0个或多个子结点 (2)每个子结点只有一个父结点 &#xff…

DICOM 网络服务实现:医学影像传输与管理的技术实践

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…

TongWeb7.0常用-D参数说明

Web容器相关启动参数配置 属性 含义 -Dtongweb.restart.interval 设置宕机后重启的时间间隔,以秒为单位。如果不设置这个参数,默认为1秒 -Dmonitor.abnormal.restart 设置服务器非正常状态时是否重启,如果不设置这个参数或者参数值不为…

软件架构评估方法全面解析

介绍 在软件开发过程中,架构设计的好坏直接影响系统的可维护性、可扩展性和性能。因此,软件架构评估(Software Architecture Evaluation)成为确保架构质量的关键步骤。本文将介绍几种主流的架构评估方法,包括ATAM、SA…

我开源了一个免费在线工具!UIED Tools

UIED Tools - 免费在线工具集合 最近更新:修改了文档说明,优化了项目结构介绍 这是设计师转开发的第一个开源项目,bug和代码规范可能有些欠缺。 这是一个功能丰富的免费在线工具集合网站,集成了多种实用工具,包括 AI …

【vue】全局组件及组件模块抽离

一、全局组件 只要是实例化过的区域都可以使用 Vue.component("组件名",{ template: 内容} ) 二、组件模块抽离 抽离就是把template的内容写到body里面,然后建立id写到变量下的template里,id变量写到component里 body{ template: …

深入理解 iOS 开发中的 `use_frameworks!`

在使用 CocoaPods 管理 iOS 项目依赖时,开发者经常会在 Podfile 文件中看到一个配置选项:use_frameworks!。本文将详细介绍这个配置选项的含义,以及如何决定是否在项目中使用它。 一、什么是 use_frameworks! 在 CocoaPods 中引入第三方库时…

《Python星球日记》 第57天:LSTM 与 GRU

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、LSTM 的门控机制1. LSTM 结构概述2. 遗忘门(Forget Gate)3. 输入门(Input Gate)4. 输出门(Output Gate)5. 记忆单元更新过程二、GRU 的简化…

Java SE所需工具与常见类型和运算符介绍

1.Java SE所需工具 1.1 JDK JDK全称为Java Develepment Kit(Java开发者工具包),包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java A…

QT6.8安装教程

官网下载 链接: Index of /official_releases/online_installers 这个比较慢 建议去 清华大学开源软件镜像站:Index of /qt/archive/online_installers/4.9/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 根据自己什么系统选择 点击打开…

MIT XV6 - 1.3 Lab: Xv6 and Unix utilities - primes

接上文 MIT XV6 - 1.2 Lab: Xv6 and Unix utilities - pingpong primes 继续实验,实验介绍和要求如下 (原文链接 译文链接) : Write a concurrent prime sieve program for xv6 using pipes and the design illustrated in the picture halfway down this page and…

hive两个表不同数据类型字段关联引发的数据倾斜

不同数据类型引发的Hive数据倾斜解决方案 #### 一、‌原因分析‌ 当两个表的关联字段存在数据类型不一致时(如int vs string、bigint vs decimal),Hive会触发隐式类型转换引发以下问题: ‌Key值的精度损失‌:若关联字…

【JAVA】业务系统订单号,流水号生成规则工具类

设计业务系统订单号,流水号注意事项 唯一性:确保在分布式环境下ID不重复 有序性:ID随时间递增,有利于数据库索引性能 可读性:包含时间信息,便于人工识别 扩展性:支持业务前缀和类型区分 性能…

【嵌入式开发-SPI】

嵌入式开发-SPI ■ SPI简介■ SPI (Standard SPI)■ DSPI (Dual SPI)■ QSPI是 Queued SPI的简写 ■ SPI简介 SPI协议其实是包括:Standard SPI、Dual SPI和Queued SPI三种协议接口,分别对应3-wire, 4-wire…

基于HTTP头部字段的SQL注入:SQLi-labs第17-20关

前置知识:HTTP头部介绍 HTTP(超文本传输协议)头部(Headers)是客户端和服务器在通信时传递的元数据,用于控制请求和响应的行为、传递附加信息或定义内容类型等。它们分为请求头(Request Headers&…

基于Qt开发的http/https客户端

成果展示: 使用Qt开发HTTP客户端主要依赖QNetworkAccessManager、QNetworkRequest和QNetworkReply三大核心类。以下是具体实现要点及最佳实践: 一、核心类与基础流程​​ 1.QNetworkAccessManager​​ 作为HTTP请求的管理者,负责异步处理…

自适应蒙特卡洛定位-AMCL

自适应蒙特卡洛定位,简称AMCL,主要提供定位功能并以/tf形式输出 蒙特卡洛算法的基本思想:当所要求的问题是某种事件出现的概率或者是某个变量的期望值时,它们可以通过某种"试验"的方法,得到这种事件出现的概…

鲁滨逊归结原理详解:期末考点+解题指南

1. 引言 归结原理(Resolution Principle) 是自动定理证明和逻辑推理的核心技术,由约翰艾伦罗宾逊(John Alan Robinson)于1965年提出。它是一阶谓词逻辑的机械化推理方法,广泛应用于人工智能(如…

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1商用服务开通教程以及模型体验

在当今数字化浪潮迅猛推进的时代,云计算与人工智能技术的深度融合正不断催生出众多创新应用与服务,为企业和个人用户带来了前所未有的便利与发展机遇。本文将重点聚焦于在华为云这一行业领先的云计算平台上,对 DeepSeek-V3/R1 商用服务展开的…

Matlab基于PSO-MVMD粒子群算法优化多元变分模态分解

Matlab基于PSO-MVMD粒子群算法优化多元变分模态分解 目录 Matlab基于PSO-MVMD粒子群算法优化多元变分模态分解效果一览基本介绍程序设计参考资料效果一览 基本介绍 PSO-MVMD粒子群算法优化多元变分模态分解 可直接运行 分解效果好 适合作为创新点(Matlab完整源码和数据),以包…