使用StrictMode优化Android应用程序的ANR率

使用StrictMode优化Android应用程序的ANR率

本文将解释StrictMode是什么以及如何在Android应用程序中使用它作为ANR观察器。

什么是StrictMode以及为什么使用它?

StrictMode是帮助开发人员防止ANR并减少在Android系统中产生ANR的机会的工具之一。

从developer.android.com上可以得知,使用StrictMode有助于在开发应用程序时找到在主线程上意外进行的I/O操作。

https://developer.android.com/topic/performance/vitals/anr?hl=zh-cn

我们可以将StrictMode用作分析器工具,它在运行时分析应用程序进程的主线程。它基于两种策略模型工作,如果违反了任何策略,则会采取相应的措施。

StrictMode策略

线程策略

磁盘读取、磁盘写入、网络、资源不匹配和缓慢代码

VM策略

Activity泄漏、SQLite对象、可关闭对象、对象泄漏和文件URL暴露。

正如我们所知,ANR与主线程上的资源密集型任务相关,因此StrictMode启用了所有可能导致ANR的原因,将其视为策略违规。

如何实施StrictMode?

在学习如何在任何Android进程中使用StrictMode时,让我们通过一个实际示例看看StrictMode策略违规。

首先,我们可以创建一个简单的单页面默认的“Hello World!” Android应用程序,并在其中初始化一个文本视图。

public class MainActivity extends AppCompatActivity {

    TextView text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = findViewById(R.id.text);

    }
}

让我们在UI线程上执行一些耗时操作。所以最简单的方法是编写一个while循环,并在其中无限更新一个文本视图,这肯定会导致ANR。

@Override
    public boolean onTouchEvent(MotionEvent event) {
        while(true) {
            String s = new String("ABC");
            text.setText(s);
        }
    }

当您在屏幕上触摸任何位置时,希望您能看到ANR对话框出现在您的应用程序中。

现在,您可以将StrictMode启用代码添加到主活动的onCreate方法中。

原则上,这段代码应该添加到Application类中,但为了更容易理解概念,我们不必让它变得更复杂。

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectDiskReads()
                .detectDiskWrites()
                .detectNetwork()
                .penaltyLog()
                .build());

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedSqlLiteObjects()
                .detectLeakedClosableObjects()
                .penaltyLog()
                .penaltyDeath()
                .build());

现在运行应用程序并观察行为!!

在下面的视频中,可以看到当我启用StrictMode策略后,应用程序直接崩溃,而不是显示ANR对话框,并且在日志中记录了StrictMode违规。

D  StrictMode policy violation: android.os.strictmode.LeakedClosableViolation: 
A resource was acquired at attached stack trace but never released. 
See java.io.Closeable for information on avoiding resource leaks. 
Callsite: close
    at android.os.StrictMode$AndroidCloseGuardReporter.report(StrictMode.java:1991)
    at dalvik.system.CloseGuard.warnIfOpen(CloseGuard.java:338)
    at sun.nio.fs.UnixSecureDirectoryStream.finalize(UnixSecureDirectoryStream.java:580)
    at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:319)
    at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:306)
    at java.lang.Daemons$Daemon.run(Daemons.java:140)
    at java.lang.Thread.run(Thread.java:1012)
W  StrictMode VmPolicy violation with POLICY_DEATH; shutting down.
I  Sending signal. PID: 20526 SIG: 9
I  Process com.example.anrexample (pid 20526) has died: fg  TOP 
I  WIN DEATH: Window{afd4cf6 u0 com.example.anrexample/com.example.anrexample.MainActivity}
I  Successfully killed process cgroup uid 10163 pid 20526 in 0ms

正如我们所见,StrictMode可以帮助检测策略违规并使应用程序崩溃。

结论

Android在处理由应用程序在运行时引入的许多问题情况方面表现出色,在处理ANR方面也是如此,通过在UI线程上维持5秒钟的资源密集型任务。

然而,作为程序员,我们有责任遵循框架给出的编程标准,因为超过5秒后,ANR将成为糟糕用户体验的结果。

因此,首先我们需要遵循所有的编码标准以预防ANR,并且如果有什么需要改进的地方,可以使用StrictMode作为工具,以免因疏忽而留下意外。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抖音跳转微信公众号是怎么实现的丨数灵通

抖音是一款非常流行的社交媒体应用程序,用户可以在其中分享短视频和互动内容。许多用户希望通过抖音来引流到他们的微信公众号,以扩大影响力并吸引更多粉丝。以下是一些关于如何在抖音上跳转到微信公众号的科普信息: 1.信息流广告&#xff1a…

elementplus Dialog 对话框设置距离页面顶部的距离

默认为 15vh&#xff0c;当弹窗过于高的时候&#xff0c;这个距离其实是不合适的 <el-dialogv-model"dialogVisible"title"Tips"width"30%":before-close"handleClose"top"6vh"><span>This is a message</s…

leetcode:2859. 计算 K 置位下标对应元素的和(python3解法)

难度&#xff1a;简单 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 请你用整数形式返回 nums 中的特定元素之 和 &#xff0c;这些特定元素满足&#xff1a;其对应下标的二进制表示中恰存在 k 个置位。 整数的二进制表示中的 1 就是这个整数的 置位 。 例如&#xf…

如何实现激光雷达运动补偿,这篇就够了

目录 激光雷达为什么会存在运动畸变 激光雷达如何运动去畸变 C++实践激光雷达运动补偿(辅助传感器) 实践激光雷达ICP运动补偿 参考文献 激光雷达为什么会存在运动畸变 首先要理解为什么会产生运动畸变。激光雷达扫描物体形成点云的过程自身伴随着旋转运动,每次激…

嵌入式-stm32-江科大-EXTI外部中断

一&#xff1a;EXTI外部中断&#xff08;external interrupt&#xff09; 1.1 STM32 中断系统 中断是指在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前的程序&#xff0c;转而去处理中断程序&#xff0c;…

Termux结合内网穿透实现无公网ip远程SFTP传输文件

目录 前言 1. 安装openSSH 2. 安装cpolar 3. 远程SFTP连接配置 4. 远程SFTP访问 4. 配置固定远程连接地址 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Termux结合内网穿透实现无公网ip远程SFTP传输文件&#xff0c;希望大家能…

【基础算法练习】二分模板

文章目录 二分模板题二分的思想C 版本的二分整数二分模板 Golang 版本的二分整数二分模板 例题&#xff1a;在排序数组中查找元素的第一个和最后一个位置题目描述C 版本代码Golang 版本代码 二分模板题 704. 二分查找&#xff0c;这道题目是最经典的二分查找&#xff0c;使用于…

华为产业链之车载激光雷达

一、智能汽车 NOA 加快普及&#xff0c;L3 上路利好智能感知硬件 1、感知层是 ADAS 最重要的一环 先进驾驶辅助系统 &#xff08;ADAS&#xff0c; Advanced driver-assistance system&#xff09;分“感知层、决策层、执行层”三个层级&#xff0c;其中感知层是最重要的一环…

不同页面加载对爬虫的影响

目录 前言 1. 不同页面加载方式对爬虫的影响 1.1 静态页面加载 1.2 动态页面加载 2. 使用代理IP进行访问 总结 前言 在进行网络爬虫的过程中&#xff0c;不同的网页加载方式可以对爬虫的效率和稳定性产生重要影响。有些网站可能会限制对其服务器的访问频率&#xff0c;如果…

怎么把ico图片转png?图片格式转换的快捷方法

ICO是一种常用的图标文件格式&#xff0c;广泛用于软件应用的图标设计&#xff0c;然而&#xff0c;ICO格式的图片分辨率通常较低&#xff0c;因此在某些平台上无法满足上传要求&#xff0c;为了解决这个问题&#xff0c;我们通常需要将ICO格式转换为常见的PNG格式或其他常用格…

GuitarPro和Earmaster那个适合新手

许久没发文了&#xff0c;最近在网上刷到了一位音乐UP主从容Free&#xff0c;他把自己对GuitarPro和Earmaster这2款软件的使用感受进行了详细分享&#xff0c;还没看过的朋友可以戳下面的链接跳转到小破站看完整的&#xff1a; 我不允许还有人不知道这个学吉他的神器&#xff…

YOLO 自己训练一个模型

一、准备数据集 我的版本是yolov8 8.11 这个目录结构很重要 ultralytics-main | datasets|coco|train|val 二、训练 编写yaml 文件 # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..] path…

抖音VR直播:沉浸式体验一键打通360度精彩

随着5G技术的发展&#xff0c;VR直播近年来也逐步进入到大众的视野中&#xff0c;相比于传统直播&#xff0c;VR直播能够提供更加丰富的内容和多样化的互动方式&#xff0c;让观众更有沉浸感和参与感。现如今&#xff0c;抖音平台也上线了VR直播&#xff0c;凭借沉浸式体验和有…

无公网IP实现远程访问MongoDB文件数据库【内网穿透】

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2…

pytorch与tensorflow如何选择?

目录 1.动态图和静态图1.1 tensorflow是静态图1.2 pytorch动态图 2. 易用性3. 编程语言4. 性能和扩展性5. 社区支持和生态系统 1.动态图和静态图 1.1 tensorflow是静态图 如上图&#xff1a; 定义计算图&#xff08;公式&#xff0c;包括定义变量x,y ,zx*y&#xff09;给公式…

开源客户沟通平台Chatwoot账号激活问题

安装docker docker-compose 安装git clone https://github.com/chatwoot/chatwoot 下载之后根目录有一个docker-compose.production.yaml将其复制到一个目录 重命名 docker-compose.yaml 执行docker-compose up -d 构建 构建之后所有容器都安装好了 直接访问http://ip:3…

嵌入式软件工程师面试题——2025校招社招通用(C/C++)(三十八)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…

【正点原子STM32】STM32基础知识(F1F4F7H7 STM32系统框架、寻址范围、存储器映射的存储器功能划分、寄存器映射)

一、STM32系统框架 1.1、Cortex M内核 & 芯片1.2、F1系统架构1.3、F4系统架构1.4、F7系统架构1.5、H7系统架构 二、STM32的寻址范围&#xff1f; 三、存储器映射 存储器功能划分&#xff08;F1为例&#xff09;STM32F1存储器映射图 四、寄存器映射 寄存器基础知识STM3…

景联文科技大模型数据集更新!教育题库新增高质量数学题、逻辑推理题及英文题

苏格拉底曾以“点燃火焰”的理念来诠释教育。随着大语言模型在教育中的不断应用&#xff0c;教育与AI的深度融合&#xff0c;让我们看到了“点燃火焰”的理念的更多可能性。 大语言模型可以通过与学生的互动&#xff0c;为他们提供个性化的学习体验&#xff0c;更好地满足学习需…

“创新地引入了”和“创新地提出了”这两个词语有什么区别?

问题描述&#xff1a;“创新地引入了”和“创新地提出了”这两个词语有什么区别&#xff1f; 问题解答&#xff1a; "创新地引入了"更侧重于将他人的方法、概念或技术引入到一个新的领域、环境或情境中。这可能表示说话者正在借鉴、采用别人的创新性方法&#xff0c…