当前位置: 首页 > news >正文

【Android】画面卡顿优化列表流畅度六(终篇)

上一篇:
【Android】画面卡顿优化列表流畅度五之下拉刷新上拉加载更多组件RefreshLayout修改

场景回顾:

业务经过一年半左右的运行后,出现了明显的列表卡顿情况;于是开始着手进行列表卡顿优化。目前的情况是:

  1. 网络图片渲染耗时大
  2. 上下滑动反应慢,甚至画面不动
  3. 新增一页数据加载渲染时耗时比较大,上下滑动几乎没有反应,画面停止没有交互响应
    交互体验基本摆烂了

计划的优化方向:

  • 列表组件RecyclerView刷新机制由notifyDataSetChanged()优化为notifyItemRangeInserted(),后期有必要也会使用notifyItemRangeRemoved、notifyItemRangeChanged、notifyItemMoved等等方式更新刷新数据
  • Glide图片加载库优化参数设置:缩略图thumbnail(0~1.0f)、RequestOptions里sizeMultiplier、override、dontAnimate、noTransformation()等
  • 内存优化设置clearMemory() 磁盘清理设置clearDiskCache()
  • RefreshLayout下拉刷新上拉加载更多组件;因为布局嵌套等原因这个组件和NestedScrollView不兼容;另外这个组件里的上拉加载更多的逻辑居然是有bug的,而且是对画面顿感很致命的逻辑漏洞。查了好久才发现的。吐血一升表示无语中
  • 分页加载由于历史原因并不能统一返回10条,而是有可能大于20条这样的情况存在,再吐一升;非常无语,本来图片就够重了,现在发现某些页数据数量也很重。

最终的优化方案如下:

RecyclerView刷新机制notifyItemRangeInserted已做说明这里不累赘了

https://lichong951.blog.csdn.net/article/details/134331699

Glide加载图片参数值设置也已说明

https://lichong951.blog.csdn.net/article/details/134378026

RefreshLayout下拉刷新上拉加载更多组件二次优化开发–也已说明

https://lichong951.blog.csdn.net/article/details/134398047

上面这几点是程序上的优化点,还有内存方面的优化项比较少,就不重复写了,本应该写完这三点之后应该就完结了,但列表加载网络图片的卡顿情况不只是程序上的问题,这是一整套系统工程,因此补充这一章说明整套优化项和优化方案策略

图片的大小和尺寸设定

由于每项业务场景使用的图片都是从后台管理上传的,但由于之前都是同一组的开发同事进行图片处理上传,知晓UI设计图片的大小和尺寸要求,因此在长达一年使用过程中都没有问题,但后面其他业务开发组的数据图片接入之后就导致了问题所在,所以回顾之前UI设计效果图片尺寸如下162x188:
在这里插入图片描述
因此给出的后台上传图片要求为
1、分辨率:162 x 188 也不是必须是这个尺寸,可以作为参考尺寸使用。像之前的那种1108 x 1282是肯定不可以的了
2、大小:参考值是5kb以下;1kb最佳。但考虑到不同业务组的实际情况,可以放开到20kb以下即可。这样的大小基本不影响渲染效果和耗时,当然如果业务上进行极限操作也可以设置到1kb以下
3、图片格式作为android当然更倾向使用webp格式的图片,但有可能IOS那边不兼容,所以使用png格式是最优解
以上是对网络图片的参考要求了

分页数据条数设定

这个对于一般的项目上应该不是问题,基本都能做到按分页要求每页10条拉取数据;
但笔者的项目就奇葩了一些需要规范一下,原本也是每页10条数据。
但后期版本迭代的时候,其他项目组的业务数据接入的时候发生了扭曲了。不能按原本的那种方式拉取每页10条数据,而是按日期拉取数据条数。这也是为什么有时候新增的页会有超过20条数据的情况发生,虽然不多,但叠加网络图片和glide的使用不当于是就体现在用户体验上卡顿情况明显了。
于是就针对性提出了后台的每天的数据条数要在10条以下,如果超过就放到后面的设定日期里,如果后面的日期里超过10条,则同理放到更后面的日期里即可。

另外就是列表布局的嵌套问题了

/**
* 布局嵌套为
* NestedScrollView
* BGARefreshLayout
* RecyclerView
* */

这样的xml布局结构笔者后来想了想应该是所有的一般的下拉刷新上拉加载更多组件都不会兼容了,也只有实际使用场景才会出现,这个就要考验开发者对开源组件和实际布局之间的落差而进行二次开发补充了。
笔者当前的博客也不过是补充了其中一种情况而已,实际的场景和UI交互设计等可能还有多种布局嵌套情况,比如横向列表嵌套到纵向列表等等,还有viewpage多重嵌套等等。
但都不用太过担心,android这些年的技术博客都足以解决这些问题。
到此整个优化过程基本完成。其实原本可以只写几个优化点就可以了,后来想了想还是做成一个完整系列把列表卡顿的优化彻底从头到尾的搞定。
参考本系列基本都能开发出接近京东或者其他大厂首页的丝滑的交互体验效果!

======END

下面是一个推荐,笔者业余开发的一个提高开发效率的工具,有兴趣或者有疑问欢迎使用留言蛤!

smartApi接口开发工具推荐

推荐理由

postman在国内使用已经越来越困难:
1、登录问题严重
2、Mock功能服务基本没法使用
3、版本更新功能已很匮乏
4、某些外力因素导致postman以后能否使用风险较大
出于以上考虑因此笔者自己开发了一款api调试开发工具SmartApi,满足基本日常开发调试api需求

简介

历时一年半多开发终于smartApi-v1.0.0版本在2023-09-15晚十点正式上线
smartApi是一款对标国外的postman的api调试开发工具,由于开发人力就作者一个所以人力有限,因此v1.0.0版本功能进行精简,大功能项有:

  • api参数填写
  • api请求响应数据展示
  • PDF形式的分享文档
  • Mock本地化解决方案
  • api列表数据本地化处理
  • 再加上UI方面的打磨

下面是一段smartApi使用介绍:
在这里插入图片描述

下载地址:

https://pan.baidu.com/s/1kFAGbsFIk3dDR64NwM5y2A?pwd=csdn

相关文章:

【Android】画面卡顿优化列表流畅度六(终篇)

上一篇: 【Android】画面卡顿优化列表流畅度五之下拉刷新上拉加载更多组件RefreshLayout修改 场景回顾: 业务经过一年半左右的运行后,出现了明显的列表卡顿情况;于是开始着手进行列表卡顿优化。目前的情况是: 网络图…...

一文了解:离散型制造业轻量化MES解决方案

离散型制造业的特点 离散型生产行业主要是通过对原材料物理形状的改变、组装,成为产品,使其增值。典型的离散型行业包括:机械、电子、航空、汽车等行业。这些企业既有按订单生产(MTO),也有按照库存生产&am…...

《云计算:云端协同,智慧互联》

《云计算:云端协同,智慧互联》 云计算,这个科技领域中的热门词汇,正在逐渐改变我们的生活方式。它像一座座无形的桥梁,将世界各地的设备、数据、应用紧密连接在一起,实现了云端协同,智慧互联的愿…...

Java stream流 常用记录

根据列表中的某个字段进行去重 // 根据roleKey对列表去重return roleList.stream().map(AccountRole::getRoleKey).distinct().map(roleKey -> roleList.stream().filter(role -> role.getRoleKey().equals(roleKey)).findFirst().orElse(null)).filter(Objects::nonNul…...

Spring Security6 用户身份认证

前提 你需要先拜读 [Spring Security 6 官方文档](https://docs.spring.io/spring-security/reference/servlet/authentication/architecture.html#servlet-authentication-authenticationmanager) 你需要弄清楚身份认证(Authentication)和鉴权&#xff…...

钩子函数-hook

钩子函数-hook hook 的作用 利用钩子函数可以在所有测试用例执行前做一些预置操作(如:准被测试数据、测试环境) 或者在测试结束后做一些后置操作(如:清理测试数据) 钩子函数在其它框架中也有&#xff0…...

拉链表-spark版本

采用spark实现的拉链表 拉链表初始化 import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions.lit/*** 拉链表初始化*/ object table_zip_initial {val lastDay "9999-12-31"def main(args: Array[String]): Unit {var table_base &q…...

【笔记1-2】Qt系列:QkeyEvent 键盘事件 设定快捷键

参考文献 QKeyEvent 类用来描述一个键盘事件。当键盘按键被按下或者被释放时,键盘事件便会被发送给拥有键盘输人焦点的部件。QKeyEvent 的 key() 函数可以获取具体的按键关键字。需要特别说明的是,回车键在这里是 Qt::Key_Return;键盘上的一…...

adb突然获取不到华为/荣耀手机。。。

手机一开始都是好好的,adb获取正常,adb执行命令正常。突然有一天不好使了。。。。。 重启、换usb线都试过。。。。。。 看到hisuite模式和adb冲突这篇帖子,尝试下载华为手机助手去链接,但一直连接不上。 最后我的处理方法是&#…...

layui的layer.confirm获取按钮焦点

因为ayer.confirm的按钮并非采用button,而是a标签,所以获取按钮焦点获取不到,要采用别的方法,下面介绍在ie11中和ie8中不同的写法 在ie11中 layer.confirm(确定取消这个弹窗吗?,{btn: [确定, 取消],success:function…...

【HarmonyOS】鸿蒙应用开发基础认证题目

系列文章目录 【HarmonyOS】鸿蒙应用开发基础认证题目; 文章目录 系列文章目录前言一、判断题二、单选题三、多选题总结 前言 随着鸿蒙系统的不断发展,前不久,华为宣布了重磅消息,HarmonyOS next 开发者版本会在明年(…...

Mocha

Mocha介绍 介绍 Cypress 底层依赖于很多优秀的开源测试框架,其中就有 MochaMocha 是一个适用于 Node.js 和浏览器的测试框架,它使得异步测试变得简单 JS 语言带来的问题 JS 是单线程异步执行的,这使得测试变得复杂,因为无法像…...

Java详解I/O

前言: 小弟能力不足,认知有限,难免考虑不全面,希望大佬能给出更好的建议,指出存在的问题和不足,在此跪谢。 IO发展史 Java中对于I/O能力的支持主要分为三个比较关键的阶段: BIO 第一个阶段…...

数据处理生产环境_spark获取df列当前日期的前一天日期

需求描述: 我现在有一个dataframe,名为dfin,样例数据如下 a1_id_lxha2_PHtime比亚迪_汉1232023-11-15 12:12:23比亚迪_汉1252023-11-15 13:14:51比亚迪_汉1232023-11-15 12:13:23比亚迪_汉1262023-11-16 14:12:34比亚迪_秦2312023-11-15 14:12:28比亚迪_秦2342023…...

第四代智能井盖传感器,实时守护井盖位安全

城市管理中井盖的安全问题始终是一个不容忽视的方面。传统的巡检方式不仅效率低下,无法实现实时监测,而且很难准确掌握井盖的异动状态。因此智能井盖传感器的应用具有重要意义。这种智能传感器可以帮助政府实时掌握井盖的状态,一旦发现异常情…...

【前端知识】Node——文件流的读写操作

四种基本流类型: 1.Writable: 可以向其写入数据的流 2.Readable: 可以从中读取数据的流 3.Duplex:同时为Readable 和 Writable 4.Transform: Duplex可以在写入和读取数据时修改或转换数据的流 一、Readable const fs require(fs);// 创建文件的Readable const rea…...

解决证书加密问题:OpenSSL与urllib3的兼容性与优化

在使用客户端证书进行加密通信时,用户可能会遇到一些问题。特别是当客户端证书被加密并需要密码保护时,OpenSSL会要求用户输入密码。这对于包含多个调用的大型会话来说并不方便,因为密码无法在连接的多个调用之间进行缓存和重复使用。用户希望…...

#gStore-weekly | gAnswer源码解析 调用NE模块流程

简介 gAnswer系统的主要思想,是将自然语言问题转化为语义查询图,再和RDF图做子图匹配。在转换成查询图的第一步就是确定查询图的节点,即节点提取(Node Extraction, NE)。 查询图中的节点由实体(entity&am…...

vscode 配置 lua

https://luabinaries.sourceforge.net/ 官网链接 主要分为4个步骤 下载压缩包,然后解压配置系统环境变量配置vscode的插件测试 这里你可以选择用户变量或者系统环境变量都行。 不推荐空格的原因是 再配置插件的时候含空格的路径 会出错,原因是空格会断…...

vscode设置代码模板

一键生成vue3模板代码 效果演示 输入vue3 显示快捷键 按回车键 一键生成自定义模板 实现方法 进入用户代码片段设置 选择片段语言 vue.json输入自定义的代码片段 prefix是触发的内容,按自己的喜好来就行; body是模板代码,写入自己需要的…...

编程入门必看的10个学习误区,踩中一个就白学半年

文章目录前言误区一:盲目跟风热门语言,频繁切换误区二:过度依赖AI生成代码,不理解底层逻辑误区三:只看视频不写代码,眼高手低误区四:死磕算法,忽视工程实践误区五:只学框…...

告别繁琐手动切割:Pixelorama智能精灵图切割让效率提升90%

告别繁琐手动切割:Pixelorama智能精灵图切割让效率提升90% 【免费下载链接】Pixelorama Unleash your creativity with Pixelorama, a powerful and accessible open-source pixel art multitool. Whether you want to create sprites, tiles, animations, or just …...

Python逆向工程库Gemini-API:解锁Google Gemini多模态与深度研究全功能

1. 项目概述与核心价值如果你正在寻找一个能让你在Python项目中无缝接入Google Gemini(就是那个以前叫Bard的AI)全部能力的库,并且希望它能像官方API一样优雅易用,同时又能绕过一些官方限制,直接使用网页版的高级功能&…...

容器镜像转虚拟机:container-vm项目原理、实战与场景解析

1. 项目概述:当容器遇见虚拟机最近在折腾一个挺有意思的项目,叫wy-z/container-vm。光看这个名字,你可能觉得有点矛盾——“容器”和“虚拟机”不是两种不同的虚拟化技术吗,怎么还能放一起?这正是这个项目的精妙之处。…...

为LLM注入联网能力:SuGPT-kexue项目的架构设计与工程实践

1. 项目概述与核心价值最近在开源社区里,一个名为“SuGPT-kexue”的项目引起了不少开发者和AI爱好者的注意。这个项目名本身就挺有意思,它指向了一个非常具体且实用的场景:如何让一个大型语言模型(LLM)具备科学上网的能…...

3个步骤如何为Unity应用集成Perseus原生库功能扩展

3个步骤如何为Unity应用集成Perseus原生库功能扩展 【免费下载链接】Perseus Azur Lane scripts patcher. 项目地址: https://gitcode.com/gh_mirrors/pers/Perseus Perseus是一个专为Unity Android应用设计的原生库补丁框架,通过无偏移地址设计实现功能扩展…...

从焦耳热到激光加热:COMSOL多物理场接口全解析,手把手教你选对模块

从焦耳热到激光加热:COMSOL多物理场接口全解析与实战选型指南 当你在COMSOL Multiphysics中新建模型时,面对AC/DC、RF、波动光学等十几个模块和数十种多物理场接口,是否曾感到无从下手?特别是在电热耦合分析领域,焦耳热…...

基于Neo4j与MCP协议,为AI智能体构建动态知识图谱大脑

1. 项目概述:为AI智能体构建一个动态知识大脑如果你正在使用Cursor、Claude Desktop这类AI编程助手,并且对它们能记住上下文、理解项目结构的能力感到惊喜,那么Graphiti MCP Server可能会让你对AI智能体的认知再上一个台阶。简单来说&#xf…...

【ETL实战】StreamSets零代码构建实时数据管道

1. StreamSets:零代码ETL的神器 第一次接触StreamSets时,我被它的可视化界面震惊了。作为一个常年和代码打交道的工程师,很难想象ETL(数据抽取、转换、加载)这种复杂的数据处理流程,竟然可以不用写一行代码…...

如何用Blender3mfFormat插件轻松实现3MF文件导入导出:从新手到专家的完整指南

如何用Blender3mfFormat插件轻松实现3MF文件导入导出:从新手到专家的完整指南 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否在Blender中处理3D打印模…...