android-性能篇-卡顿与ANR

2024-05-03 20:38
文章标签 android 性能 卡顿 anr

本文主要是介绍android-性能篇-卡顿与ANR,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ANR

即使编写出能够通过世界上的所有性能测试的代码,却仍有可能让用户感觉迟钝、发生挂起或卡住很长时间,或者处理输入的时间过长。在应用响应能力方面可能发生的最糟糕的情况就是“应用无响应”(ANR) 对话框。

在 Android 中,系统会通过显示说明应用已停止响应的对话框来防范在一段时间内响应不足的应用。此时,应用已在相当长的一段时间内没有响应,因此系统会向用户提供退出此应用的选项。在设计应用时应充分考虑响应能力,让系统永远不会向用户显示 ANR 对话框,这一点至关重要。

什么会触发ANR?

当应用无法响应用户输入时,系统即会显示 ANR。

在您的应用面临任何可能需要执行冗长的操作的情况下,您不应在主线程中执行这些操作,而是应该创建工作线程并在其中执行大部分操作。这样即可让主线程(用于驱动界面事件循环)保持运行,并阻止系统断定您的代码已卡住。

在 Android 中,应用响应性由 Activity 管理器和窗口管理器系统服务监控。当 Android 检测到以下某一项条件时,便会针对特定应用显示 ANR 对话框:

  • 在 5 秒内对输入事件(例如按键或屏幕轻触事件)没有响应。
  • BroadcastReceiver 在 10 秒后尚未执行完毕。

怎么避免ANR?

Android 应用通常完全在单个线程中运行(默认为“界面线程”或“主线程”)。这意味着应用在界面线程中执行的任何需要很长时间才能完成的操作都可能会触发 ANR 对话框,因为应用没有给自己处理输入事件或 intent 广播的机会。因此,在界面线程中运行的所有方法都应该尽可能减少在此线程中的操作。

为耗时较长的操作创建工作线程的最有效方法是使用 AsyncTask 类。只需扩展 AsyncTask 并实现 doInBackground() 方法即可执行相应操作。要向用户发布进度变化,您可以调用 publishProgress(),它会调用 onProgressUpdate() 回调方法。通过 onProgressUpdate()(在界面线程中运行)的实现,您可以向用户发送通知。

虽然比 AsyncTask 复杂,但您可能想要创建自己的 Thread 或 HandlerThread 类。如果是这样,您应该调用 Process.setThreadPriority() 并传递 THREAD_PRIORITY_BACKGROUND,从而将线程优先级设为“后台”优先。如果您不通过这种方式将线程设为较低的优先级,则此线程仍可能会让应用变慢,因为默认情况下,此线程会按照与界面线程相同的优先级操作。

通常,100 到 200 毫秒是一个阈值,一旦超出此阈值,用户便能够感受到应用速度缓慢。

获取ANR日志

旧版系统
ANR Log 存放在 /data/anr/traces.txt

  • adb shell cat /data/anr/traces.txt > /…/traces.txt 导出日志文件

新版系统
/data/anr/目录没有traces.txt,而是anr_xxx

  • 输入命令 adb bugreport,在当前目录生成压缩文件

参考

  • 开发者指南

这篇关于android-性能篇-卡顿与ANR的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

JVisualVM之Java性能监控与调优利器详解

《JVisualVM之Java性能监控与调优利器详解》本文将详细介绍JVisualVM的使用方法,并结合实际案例展示如何利用它进行性能调优,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1. JVisualVM简介2. JVisualVM的安装与启动2.1 启动JVisualVM2

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Java的"伪泛型"变"真泛型"后对性能的影响

《Java的伪泛型变真泛型后对性能的影响》泛型擦除本质上就是擦除与泛型相关的一切信息,例如参数化类型、类型变量等,Javac还将在需要时进行类型检查及强制类型转换,甚至在必要时会合成桥方法,这篇文章主... 目录1、真假泛型2、性能影响泛型存在于Java源代码中,在编译为字节码文件之前都会进行泛型擦除(ty

Android 实现一个隐私弹窗功能

《Android实现一个隐私弹窗功能》:本文主要介绍Android实现一个隐私弹窗功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 效果图如下:1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来res/l

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja