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

一、缓存复用

为什么要了解这个呢?当我们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.mzph.cn/web/49812.shtml

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

相关文章

Linux---git工具

目录 初步了解 基本原理 基本用法 安装git 拉取远端仓库 提交三板斧 1、添加到缓存区 2、提交到本地仓库 3、提交到远端 其他指令补充 多人协作管理 windows用户提交文件 Linux用户提交文件 初步了解 在Linux中,git是一个指令,可以帮助我们做…

jionlp根据词典进行行政区划补全

背景 需要对地址数据进行行政区划补全的,可以用下面的方法,当然是有条件限制的,只限于提供本省的词典和补全本身的地址数据,否则容易错乱 效果测试 lp = LocationParser() loc = 侨英街道乐海南里170号 res = lp(loc) print(res)1、安装或者更新 python安装 pip insta…

Python爬虫技术 第18节 数据存储

Python 爬虫技术常用于从网页上抓取数据,并将这些数据存储起来以供进一步分析或使用。数据的存储方式多种多样,常见的包括文件存储和数据库存储。下面我将通过一个简单的示例来介绍如何使用 Python 爬取数据,并将其存储为 CSV 和 JSON 文件格…

LangChain4j-RAG高级-核心概念

RetrievalAugmentor整体概念 简单总结一下 LangChain4j中对于RetrievalAugmentor这里官方描述的比较模糊, 只在 DefaultRetrievalAugmentor章节给出来了一个灵感来源的文章(LangChain框架中的设计思路)和一个研究报告, 有兴趣可以看一下: Deconstructing RAGhttps://arxiv.o…

FRP配置内网穿透52版本以上适用

简述 适用frp配置内网穿透来说我们需要进行简单的区分,具有公网IP的服务器我们简称为服务端,内网的服务器我们可以简称为客户端,frp需要针对不同的服务器配置不同的文件 下载安装包 Linux下载地址 https://github.com/fatedier/frp/relea…

Flink SQL 的工作机制

前言 Flink SQL 引擎的工作流总结如图所示。 从图中可以看出,一段查询 SQL / 使用TableAPI 编写的程序(以下简称 TableAPI 代码)从输入到编译为可执行的 JobGraph 主要经历如下几个阶段: 将 SQL文本 / TableAPI 代码转化为逻辑执…

svelte - 5. 动画

动画函数 函数作用使用场景示例引入的模块使用示例tweened运动动画,做到渐变的效果控制进度条速度svelte/motion函数:tweened(0, { duration: 400 })spring运动动画,用于频繁变化的值控制鼠标红点顺滑度svelte/motion函数:spring({ x: 50, y: 50 }, { stiffness: 0.1, damp…

华为ensp中ISIS原理与配置(超详细)

isis原理与配置 8-20字节; 地址组成:area id,system id,set三部分组成; system id占6个字节;sel占一个,剩下的为area id区域号; system id 唯一, 一般将router id 配…

深入学习H264和H265

目录 前言 一 什么是H264/H265? H.264 (MPEG-4 AVC) H.265 (HEVC) 二 为什么要学习H264和H265? 1. 深入理解视频压缩原理 2. 硬件优化与集成 3. 调试与故障排除 4. 持续的技术更新 三 NAL(Network Abstraction Layer)详解…

【前端 11】初探DOM

JavaScript 对象 - DOM 初探 在Web开发中,DOM(Document Object Model,文档对象模型)是一个至关重要的概念。它不仅仅是一个API,更是Web页面与JavaScript代码之间的桥梁,允许开发者通过编程的方式动态地访问…

Redis:快速键值存储的入门指南

一、什么是Redis? Redis,全称为Remote Dictionary Server,是一种开源的、高性能的键值(Key-Value)存储系统。与传统的关系型数据库不同,Redis将数据主要存储在内存中,因此能够提供极低延迟的数…

【Unity2D 2022:UI】TextMeshPro组件无法显示中文

在Unity中创建了一个预制体Card,上面挂载了一些Text Mesh Pro组件用来显示卡牌信息。但是在输入文字后,发现无法显示中文: 解决方法如下: 一、导入字体文件(ttf格式)和常用字字集(txt格式&…

Linux--Socket编程UDP

前文:Socket套接字编程 UDP协议特点 无连接:UDP在发送数据之前不需要建立连接,减少了开销和发送数据之前的时延。尽最大努力交付:UDP不保证可靠交付,主机不需要维持复杂的连接状态表。面向报文:UDP对应用层…

算法:[递归/搜索/回溯]二叉树的深搜

目录 题目一:计算布尔二叉树的值 题目二:求根节点到叶节点数字之和 题目三:二叉树剪枝 题目四:验证二叉搜索树 题目五:二叉搜索树中第k小的元素 题目六:二叉树的所有路径 题目一:计算布尔…

【C语言】宏定义常量加 ; 的错误

我在使用宏定义常量定义二维数组的时候,编译器报错:应输入“]”,如下: 原因是宏定义不是C语言规定的语句,它的结尾不加 ; 。在上图的 int mine[EASY_ROWS][EASY_COLS]; 中,把 EASY_ROWS 替换为了 9;2; &…

【秋招笔试题】小明的美食

解析&#xff1a;思维题。由于需要互不相同&#xff0c;每次操作取重复的值与最大值相加即可&#xff0c;这样即可保证相加后不会新增重复的值。因此统计重复值即可。 #include <iostream> #include <algorithm>using namespace std; const int maxn 1e5 5; int…

大模型算法面试题(十一)

本系列收纳各种大模型面试题及答案。 1、说一下目前主流或前沿的预训练模型&#xff0c;包括nlp&#xff08;百度ERNIE3.0&#xff0c;华为NEZHA&#xff0c;openAI gpt-3&#xff0c;nvidia MegatronLM&#xff0c;macrosoft T5&#xff09;和cv&#xff08;我只知道CLIP&…

wordpress主题Typecho仿百度响应式主题Xaink

wordpress主题Typecho仿百度响应式主题Xaink 新闻类型博客主题&#xff0c;简洁好看&#xff0c;适合资讯类、快讯类、新闻类博客建站&#xff0c;响应式设计&#xff0c;支持明亮和黑暗模式 直接下载 zip 源码->解压后移动到 Typecho 主题目录->改名为xaink->启用

内衣洗衣机和手洗哪个干净?推荐五款品质优良精品

在日常生活中&#xff0c;内衣洗衣机已成为现代家庭必备的重要家电之一。选择一款耐用、质量优秀的内衣洗衣机&#xff0c;不仅可以减少洗衣负担&#xff0c;还能提供高效的洗涤效果。然而&#xff0c;市场上众多内衣洗衣机品牌琳琅满目&#xff0c;让我们往往难以选择。那么&a…

实时捕获数据库变更

1.CDC概述 CDC 的全称是 Change Data Capture &#xff0c;在广义的概念上&#xff0c;只要能捕获数据变更的技术&#xff0c;我们都可以称为 CDC 。我们目前通常描述的CDC 技术主要面向数据库的变更&#xff0c;是一种用于捕获数据库中数据变更的技术&#xff0c;CDC 技术应用…