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 基…

轻松使用python照片太大,设置为宽21cm,300像素(成功)

在本篇博文中,我们将学习如何使用Python中的Pillow库来调整图片的尺寸,并且保持图片的长宽比例不变。这个功能在许多图像处理任务中非常有用,比如在网页设计、图像处理和打印等方面。 介绍 Python的Pillow库是一个功能强大的图像处理库&…

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给的回答是这…

@ 代码随想录算法训练营第6周(C语言)|Day37(贪心)

代码随想录算法训练营第6周(C语言)|Day37(贪心) Day37、贪心(包含题目 738.单调递增的数字 968.监控二叉树 ) 738.单调递增的数字 题目描述 给定一个非负整数 N,找出小于或等于 N 的最大的整…

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

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

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

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

深度探讨ThreadLocal是否真的可能引发内存泄漏

目录 引言 1. ThreadLocal的基本原理 2. 潜在的内存泄漏原因 2.1 不正确的清理 2.2 长生命周期的ThreadLocal实例 3. 示例和解决方案 示例代码: 解决方案: 4. 结论 引言 在Java多线程编程中,ThreadLocal是一个强大的工具&#xff0…

LVS负载均衡对udp流量进行参数调整一例

本文记录一套百万会话级的LVS软负载均衡系统,从加权最少链接均衡算法调整为源主机散列算法并增加会话保持时间的配置过程。 一、调整原由 业务侧为了提升平台的设备连接会话保持能力,希望将LVS软负载均衡系统的均衡算法从加权最少链接均衡算法wlc调整为源主机散列算法sh,并…

HTML -- 常用标签

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

深入解剖指针篇(2)

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

1683. 无效的推文

说在前面 🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。 题目描述 表:Tweets ------------------------- | Column Name | Type | --------…

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…

MySQL入门篇(10)-聚合函数的应用

MySQL数据库聚合函数的应用 在MySQL数据库中,聚合函数用于计算一组数据的统计值并返回结果。这些函数可以应用于查询语句中,对数据进行汇总、计数、平均值计算等操作。本文将介绍一些常用的MySQL聚合函数及其应用。 1. COUNT函数 COUNT函数用于计算指…

软考 系统分析师系列知识点之需求管理(2)

接前一篇文章:软考 系统分析师系列知识点之需求管理(1) 所属章节: 第11章. 软件需求工程 第8节. 需求管理 11.8.2 需求风险管理 人们做事情总希望一帆风顺,做项目也是如此,总是希望项目进展顺利&#xff…