Android 中的卡顿优化

常见的手机卡顿现象:

  • 视频加载慢;
  • 画面卡顿、卡死、黑屏;
  • 声音卡顿、音画不同步;
  • 动画帧卡顿,交互响应慢;
  • 滑动不跟手;
  • 列表自动更、滚动不流畅;
  • 网络响应慢、数据和画面展示慢;
  • 过度动画生硬;
  • 界面不可交互、卡死;

这些体验对于用户来说是非常糟糕的,可以说流畅行体验对于用户来说至关重要。

市面上绝大多数的 Android 设备的屏幕刷新率是 60Hz,也就是大概 16ms 刷新一次屏幕,假如花了 24ms 来绘制这一帧,就会出现掉帧的现象,在用户看来就是界面不流畅,卡顿。另外,如果系统准备绘制新的一帧到屏幕上,但是这一帧并没有准备好,就不会有绘制操作,画面也不会刷新。Android 渲染机制

一般而言,GPU 的帧速率应该高于屏幕的刷新频率,才不会卡顿和掉帧。

卡顿的本质原因是错过了展示的时间

  • 常规影响:层级以及过度绘制导致;
  • 内存影响:STW 现象导致,自定义 View 的绘制,new 对象
  • 线程影响:阻塞当前住线程的代码都会造成卡顿

卡顿

  • UI线程阻塞:UI线程是主线程,很多性能卡顿的问题是由于我们在主线程中做了大量的耗时操作引起的,比如 IO 操作、网络请求、SQL 操作、列表刷新等。

    • 将耗时操作放在子线程中,避免阻塞 UI 线程;

    • 在 Android 5.0 的版本中,引入了 RenderThread 线程,也就是渲染线程,用于向 GPU 发送实际渲染的操作;

  • 垃圾回收机制(GC):在 GC 期间会暂停当前所有业务线程,也就是 STW(stop the world)。

  • 内存泄漏:未及时释放无用的对象和资源会导致内存泄漏,最终引发内存溢出和应用卡顿。常见的内存泄漏情况包括未关闭的数据库连接、未释放的 Bitmap 对象等。

    • 对于持有 Context 的对象,使用弱引用或静态弱引用来避免内存泄漏;
    • 确保在不再使用的时候及时释放对象和资源,如关闭数据库连接,释放 Bitmap 对象等;
  • 图片加载不当:大图加载、频繁的图片加载和未释放的图片资源会占用大量内存和带宽,导致应用卡顿;

    • 使用图片加载库(如 Glide、Picasso)来加载图片,它们可以自动进行图片压缩和内存缓存,减少内存占用和加载时间;
    • 对于大图,使用 BitmapFactory.Options 进行图片压缩;
    • 及时释放不再使用的图片资源,避免占用过多的内存;
  • 数据处理不当:当处理大量数据时,未使用合适的数据结构和算法,或将耗时的数据处理操作放在主线程中,会导致应用卡顿;

    • 使用合适的数据结构和算法来处理大量数据,避免耗时的遍历操作
    • 将耗时的数据处理操作放在子线程中进行,避免阻塞 UI 线程;

因此,引起卡顿的核心原因:内存和线程。

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

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

相关文章

【机器学习 深度学习】卷积神经网络简述

🚀个人主页:为梦而生~ 关注我一起学习吧! 💡专栏:机器学习 欢迎订阅!相对完整的机器学习基础教学! ⭐特别提醒:针对机器学习,特别开始专栏:机器学习python实战…

算法:箱子之形摆放

一、算法描述及解析 要求将一批箱子按从上到下以‘之’字形的顺序摆放在宽度为 n 的空地上,输出箱子的摆放位置, 例如:箱子ABCDEFG,空地宽为3。 如输入: ABCDEFG 3 输出: AFG BE CD 注:最后一行…

uni-app 经验分享,从入门到离职(三)——关于 uni-app 生命周期快速了解上手

文章目录 📋前言⏬关于专栏 🎯什么是生命周期🧩应用生命周期📌 关于 App.vue/App.uvue 🧩页面生命周期📌关于 onShow 与 onLoad 的区别 📝最后 📋前言 这篇文章是本专栏 uni-app 基…

MacBook安装虚拟机Parallels Desktop

MacBook安装虚拟机Parallels Desktop 官方下载地址: https://www.parallels.cn/pd/general/ 介绍 Parallels Desktop 被称为 macOS 上最强大的虚拟机软件。可以在 Mac 下同时模拟运行 Win、Linux、Android 等多种操作系统及软件而不必重启电脑,并能在不同系统间随…

MySQL原理(一)架构组成之逻辑模块(2)缓存机制

前面提到了mysql的逻辑模块中包含Query Cache 。 一、查询缓存 1、作用 MySQL查询缓存即缓存查询数据的SQL文本及查询结果,用Key-Value的形式保存在服务器内存中。当查询命中缓存,MySQL会立刻返回结果,跳过了解析,优化和执行阶段。 2、查询缓存的命中条件 (1&a…

canvas路径剪裁clip(图文示例)

查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

(软件分享)Fotor - AI照片编辑器

【应用名称】:Fotor - AI照片编辑器 【适用平台】:#Android 【软件标签】:#Fotor 【应用版本】:7.5.0.2➡7.5.1.5 【应用大小】:225MB 【软件说明】:软件升级更新。Fotor 包含编辑照片所需的所有工具。用户…

踩坑系列——mysql数据库字段类型为tinyint输入字符串条件查询无效

背景 排查问题发现有个查询sql的条件传的字符串‘ENABLE’,而数据库这个字段类型是tinyint,值只有0和1,看查询结果过滤出的都是值为0的数据。按自己理解这个语句应该查不出数据,但是结果非预期 排查 问了下ChatGpt给的回答是这…

CH395Q之CH395Q驱动库移植与驱动库分析(二)

本节主要介绍以下内容: 一、CH395Q驱动库移植 二、源码分析 一、CH395Q驱动库移植 驱动库移植主要有两个途径,一个是南京沁恒官方网址,一个是通过正点原子官方,原子官方对沁横官方提供的驱动库进行了完善与修改。自用的话推荐…

1个 THM 和多台 BSP 的通讯(以邦纳 BSP 系列 PLC 为例)

一.架构和接线如下图所示 二、建立连接 选择 PLC 的驱动,多台连接请勾选“次连接” “次连接总数”就是要连接的 PLC 台数。 设置触摸屏通讯参数;同时确保每台 PLC 的通讯参数与该设定相同(但站号不能相同)。 三、…

HTML -- 常用标签

标签 表示HTML网页内容的一个最基本的组织单元,类似于语文中的标点符号, 标签的作用:告诉浏览器当前标签中的内容是什么,以什么格式在页面中进行呈现 单标签 单标签(只有一个标签名的标签)的标签格式&…

深入解剖指针篇(2)

目录 指针的使用 strlen的模拟实现 传值调用和传址调用 数组名的理解 使用指针访问数组 一维数组传参的本质 冒泡排序 个人主页(找往期文章):我要学编程(ಥ_ಥ)-CSDN博客 指针的使用 strlen的模拟实现 库函数strlen的功能是求字符串…

PySpark(二)RDD基础、RDD常见算子

目录 RDD RDD五大特性 RDD创建 RDD算子 常见的Transformation算子 map flatMap mapValues reduceByKey groupBy filter distinct union join intersection glom groupByKey groupByKey和reduceByKey的区别 ? sortBy sortByKey 常见的action算子 countByKey…

Python入门到精通(七)——Python文件操作

Python文件操作 一、文件的编码 二、文件的读取 1、操作汇总 2、model 常用的三种基础访问模式 三、文件的写入 四、文件的追加 五、综合案例 一、文件的编码 1、什么是编码? 编码就是一种规则集合,记录了内容和二进制间进行相互转换的逻辑。编…

Flink1.14新版KafkaSource和KafkaSink实践使用(自定义反序列化器、Topic选择器、序列化器、分区器)

前言 在官方文档的描述中,API FlinkKafkaConsumer和FlinkKafkaProducer将在后续版本陆续弃用、移除,所以在未来生产中有版本升级的情况下,新API KafkaSource和KafkaSink还是有必要学会使用的。下面介绍下基于新API的一些自定义类以及主程序的…

解析Excel文件内容,按每列首行元素名打印出某个字符串的统计占比(超详细)

1.示例: 开发需求:读取Excel文件,统计第3列到第5列中每列的"False"字段占比,统计第6列中的"Pass"字段占比,并按每列首行元素名打印出统计占比 1.1 实现代码1:列数为常量 请确保替换y…

测试access和trunk口的区别(华为)

思科设备参考:测试access和trunk口的区别(思科) 一,实验目的 实现同一 Vlan 内的主机互通,不同 Vlan 间的主机隔离。 二,配置前测试 PC1分别ping PC2、PC3、PC4都能通,因为四台PC默认同处于v…

一文掌握SpringBoot注解之@Configuration知识文集(2)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

【JAVA】单例模式的线程安全性

🍎个人博客:个人主页 🏆个人专栏:JAVA ⛳️ 功不唐捐,玉汝于成 目录 正文 我的其他博客 正文 老生常谈的问题了,首先要说的是单例模式的线程安全意味着:某个类的实例在多线程环境 下只会被…

main函数中参数argc和argv用法解析

1 基础 argc 是 argument count 的缩写,表示传入main函数的参数个数; argv 是 argument vector 的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0]一定是程序的名称,并且包含了程序所在的完整路径&…