Android 列表或网格形式展示大量数据:RecyclerView(二):缓存复用

news2024/12/23 9:59:09

一、缓存复用

为什么要了解这个呢?当我们rv出现卡顿,出现闪烁的时候,你应该如何优化呢?
为什么有时候onCreateViewHolder会被调用?onBindVilewHolder会被调用呢?
visiable的使用,会导致重新绘制?

1.1 为什么需要缓存复用呢?

  1. 避免重复创建视图:
    当列表项移出屏幕时,如果不进行缓存复用,每次新项进入屏幕时都需要重新创建视图(View)和绑定数据,这是一个资源消耗较大的过程。
    通过缓存复用,RecyclerView可以重用已经创建并绑定过数据的视图,避免重复创建和绑定,从而节省资源,提高性能。
  2. 减少findViewById调用:
    findViewById是一个相对耗时的操作,特别是在复杂的布局中。
    通过缓存复用,RecyclerView可以减少对findViewById的调用次数,因为视图一旦创建并绑定数据后,就可以被多次重用,而无需再次通过findViewById来查找视图中的元素。
  3. 快速响应滑动操作:
    当用户快速滑动列表时,RecyclerView需要迅速加载和显示新的列表项。
    通过缓存复用,RecyclerView可以快速地从缓存中获取已经创建并绑定过数据的视图,并显示给用户,从而提升应用的响应能力。

1.2 复用的是什么?

ViewHolder是RecyclerView缓存复用的主要对象。而ViewHolder的使用,则涉及到onCreateViewHolder方法和onBindViewHolder方法的回调。
(1)onCreateViewHolder:这个方法的主要作用是加载RecyclerView子项的布局,并返回一个ViewHolder对象。
(2)onBindViewHolder:这个方法的主要作用是将数据绑定到ViewHolder中缓存的视图上。

这两个方法并非每一个进入屏幕的列表项都会回调,相反,由于视图创建及findViewById执行等动作都主要集中在这两个方法,每次都要回调的话反而效率不佳。因此,我们应该通过对ViewHolder对象积极地缓存复用,来尽量减少对这两个方法的回调频次。

1.3 RecyclerView的缓存机制

Scrap缓存:
(1)Scrap缓存是最轻量的缓存,主要用于临时存放布局过程中需要重用的ViewHolder,也就是仍在当前屏幕可见以及预加载的ViewHolder。也就是如下图这一部分
在这里插入图片描述
mCachedViews缓存:
(1)CachedViews缓存用于存放刚刚移出屏幕的ViewHolder。当用户滑动屏幕时,如果之前移出的项又重新进入屏幕,RecyclerView就可以从CachedViews缓存中快速获取并重用这些ViewHolder。

mCachedViews缓存的默认大小是2,这意味着它最多可以缓存两个ViewHolder。这个大小是可以通过调用RecyclerView的setItemViewCacheSize(int size)方法来动态设置的,以适应不同的场景和需求。但是,过大的缓存容量可能会增加内存的使用,因此需要谨慎设置。
在这里插入图片描述
RecycledViewPool缓存
(1)RecycledViewPool是一个全局的缓存池,用于存放不同类型的ViewHolder。
当CachedViews缓存满了或者RecyclerView被销毁时,多余的ViewHolder会被放入RecycledViewPool中。
当需要创建新的ViewHolder时,RecyclerView会首先尝试从RecycledViewPool中获取。

其会先以SparseArray区分不同的itemType,然后每种itemType对应的值又以ArrayList的形式持有着每个列表项的ViewHolder对象,每种itemType的ArrayList大小限制默认为5。

这种缓存结构主要考虑的是随着被滑出屏幕列表项的增多,以及被滑出距离的越来越远,重新进入屏幕内的可能性也随之降低。于是Recycler就在时间与空间上做了一个权衡,允许相同itemType的ViewHolder被提取复用,只需要重新绑定数据即可。
在这里插入图片描述
总结:

缓存结构是否回调createView是否回调bindView
Scrap缓存
mCachedViews缓存
RecycledViewPool缓存

1.4 那么我们如何做优化呢?

(1)如果我们的item是固定的,创建出来以后不会发生改变。那么我们可以将mCachedViews的缓存是适当放大。通过homeRvProduct.setItemViewCacheSize(10)方法进行修改。这样createView和bindView 方法都不会被调用,滑动过程中的闪烁,和创建,就会减少,类似于findViewById的操作也会减少。
(2)homeRvProduct.recycledViewPool.setMaxRecycledViews(0,12)setMaxRecycledViews方法是用来设置RecycledViewPool的缓存大小。参数1是指设置那个的类型的item的大小。
(3)卡顿的另外一个原因就是绘制,比如我们经常设置一些visibility方法,那么就会导致重新绘制。

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

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

相关文章

《“王栎鑫变张艺兴”?娱乐圈乌龙背后梦幻联动与未来合作遐想》

在这个充满惊喜与欢笑的娱乐圈里,每一个不经意的瞬间都可能成为网友热议的焦点,而《快乐老友记》的最新花絮,无疑为这个多彩的世界又添上了一抹亮丽的色彩。当“王栎鑫被路人认成张艺兴”这一话题如春风般拂过网络,不仅让两位才华…

【初阶数据结构】复杂度算法题篇

旋转数组 力扣原题 方案一 循环K次将数组所有元素向后移动⼀位(代码不通过) 时间复杂度O(n2) 空间复杂度O(1) void rotate(int* nums, int numsSize, int k) {while (k--) {int end nums[numsSize - 1];for (int i numsSize - 1; i > 0; i--) {nums[i] num…

JAVAWeb实战(前端篇)

项目实战一 0.项目结构 1.创建vue3项目,并导入所需的依赖 npm install vue-router npm install axios npm install pinia npm install vue 2.定义路由,axios,pinia相关的对象 文件(.js) 2.1路由(.js) import {cre…

【数据结构】详解二叉树及其操作

无论你觉得自己多么的了不起,也永远有人比你更强。💓💓💓 目录 ✨说在前面 🍋知识点一:二叉树的遍历 • 🌰1.创建一棵二叉树 • 🌰2.二叉树的遍历 •🔥前序遍历 •&a…

LLM:归一化 总结

一、Batch Normalization 原理 Batch Normalization 是一种用于加速神经网络训练并提高稳定性的技术。它通过在每一层网络的激活值上进行归一化处理,使得每一层的输入分布更加稳定,从而加速训练过程,并且减轻了对参数初始化的依赖。 公式 …

计算机导论速成笔记

【拯救者】计算机导论速成(基础真题)期末/升本均适用 ©无忌教育 ❀适⽤于所有 计算机导论 课本 目录: 好评: 特色: ①先讲本章考点, ②接着下节就讲对应的考题 观看地址:

太美了!智能汽车触摸屏中控让驾驶员和乘客目不转睛

太美了!智能汽车触摸屏中控让驾驶员和乘客目不转睛 引言 艾斯视觉作为行业ui设计和前端开发领域的从业者,其观点始终认为:智能汽车已经成为现代交通的新宠。其中,触摸屏中控系统以其美观、智能、人性化的特点,为驾驶…

GEE:多面板同步缩放查看多源数据,并实现交互选点构建NDVI曲线

一. 目标 ①构建三个面板,分别显示不同来源数据; ②面板1显示哨兵数据面版2显示谷歌高清数据面板3实现用户任意交互选点,并以该点为中心构建正方形,随后生成该正方形的区域NDVI平均值长时序曲线; ③保证前两个面板可…

第 3 章 数据和 C

目录 3.1 示例程序 3.1.1 程序中的新元素 3.2 变量与常量数据 3.3 数据: 数据类型关键字 3.3.1 整数和浮点数 3.3.2 整数 3.3.3 浮点数 3.4 C 语言基本数据类型 3.4.1 int 类型 1. 声明 int 变量 2. 初始化变量 3. int 类型常量 4. 打印 int 值 5. 八进制和十六进…

找工作准备刷题Day8 二叉树 (卡尔41期训练营 7.22)

第一题:Leetcode235. 二叉搜索树的最近公共祖先 题目描述 题解1——递归法 class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (root nullptr)return nullptr;if (root->val > p->val &&…

01、爬虫学习入门

爬虫:通过编写程序,来获取获取互联网上的资源 需求:用程序模拟浏览器,输入一个网址,从该网址获取到资源或内容 一、入门程序 #使用urlopen来进行爬取 from urllib.request import urlopen url "http://www.ba…

网络地址转换-NAT

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、相关知识 网络地址转换(Network Address Translation,NAT)的基本作用是实现内网 IP 地址与外网 IP 地址的转换…

求职学习day11背八股

本质上我和早睡早上起来玩一早上的游戏没有区别,甚至学习状态更差。得想个办法 12 点睡觉。 第三次 hr 面,为德科和华为的工作效率感到无语。 下周一两场面试。真是要死,这五天时间基本没学什么。八股、项目、手撕。。没一个有能力的感觉。…

代码随想录算法训练营第22天-leetcode-回溯算法part01:

#回溯算法理论基础 能解决的问题: 组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集排列问题:N个数按一定规则全排列&…

[023-2].第2节:SpringBoot中接收参数相关注解

我的后端学习大纲 SpringBoot学习大纲 1.1.基本介绍: SpringBoot接收客户端提交的数据、参数会使用的一些注解: 1.PathVarible2. RequestHeader3.RequestParam4.CookieValue5.RequestBody6.RequestAttribute 1.2.接收参数相关注解与应用实例:…

VirtualBox7.0.18报: IPv6 prefix is not unicast.

VirtualBox7.0.18 报: IPv6 prefix is not unicast. VirtualBox7.0.18 在设置 “NAT网络(Nat Network)” 的IPv6时, 报 IPv6 prefix x::x is not unicast. IPv6 prefix x::x is not unicast. 意思是 x::x 不是IPv6的单播地址 解决办法是: 改为 fcxx 或 fdxx 开头, 如 fc00 ,…

QT Creator下载安装详细教程(保姆级教程)

qt下载安装 1.下载网址 通过清华大学开源软件镜像站进行下载:链接: https://mirrors.tuna.tsinghua.edu.cn/qt/development_releases/online_installers/ 这里我选的是4.4版本的,也可以选择4.7版本,问题不大。 根据电脑系统选择下载linux…

一天一个Harmony Next APP

历史的车轮已经来到太平洋东海岸。 此时如果还不会撸Harmony APP,注定要被碾压。 鸿蒙开发正在如火如荼的开展,抽空看一看吧。 一看就会,一做就废。 这里是一个看废的demo。 主要通过arkts实现鸿蒙关系数据库的封装,实现数据…

搭建自己的金融数据源和量化分析平台(一):系统架构设计

0x00 前言 由于某得的数据实在是太贵,某花顺免费版又不提供专业的数据分析工具,Tushare也开始收费,因此决定基于python和MySQL搭建一个自己的金融数据库。期望做到仅依靠交易所、巨潮资讯网等官方的公开数据实现,尽量不依靠某花顺…

Java中线程池的基本使用

参考这个课程,讲的非常详细 27.线程池使用步骤总结_哔哩哔哩_bilibili 应用场景 商品秒杀 文件上传 订票系统 自定义线程池(让我们了解底层逻辑的) 构造方法 饱和机制 就是我们的队列饱和后我们该怎么处理 是拒绝这个任务还是啥…