android listview缓存机制,可视化 ListView 缓存机制,手摸手带你打通任督二脉

2023-11-22 10:20

本文主要是介绍android listview缓存机制,可视化 ListView 缓存机制,手摸手带你打通任督二脉,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

本文不涉及 ListView 缓存机制的源码探析,关于 ListView 的缓存机制郭霖前辈的《Android ListView工作原理完全解析,带你从源码的角度彻底理解》已经分析的很通彻了,同理网上也有很多文章了。本文不针对 ListView 的缓存机制做介绍,对于这块还不够了解的朋友可以阅读上方郭霖前辈的文章。另外再配上腾讯 Bugly 的图:

741f06da8850d91d20bee0505dc2d5b5.png

痛点

对于像 ListView/RecyclerView 这种级别 View 的源码是长篇且晦涩的,连郭霖前辈自己也说过 “没过几个月时间我就把当初梳理清晰的源码又忘的一干二净”。且网上的文章都是针对代码阐述的,实在是有些难以理解,且部分知识点并未涉及(例如仅针对 ViewType 只有一种情况的情形做说明,多 ViewType 情形下缓存机制少见阐述)。笔者遇到这些问题时候还是很头疼的,于是就将 ListView 的缓存机制给可视化,再针对各个情形加以总结,相信能帮助到很多对 ListView 缓存机制不太熟悉的读者们。

缓存机制解析

项目地址:ListViewVisualization或者你可以直接安装:apk。

在手摸手解析之前,需要提及到 RecycleBin 中的几个字段 ,这些字段在郭霖前辈的文章中基本都有所提及,实际上掌握了这些字段在 ListView 缓存机制中变换的情况,笔者认为对 ListView 的缓存机制了解就算是比较通彻的了——

mCurrentScrap:ArrayList 类型,用于存储离屏的 View

mScrapViews

ArrayList[] 类型

数组中每个元素都是 ArrayList 类型,效果同 mCurrentScrap

mScrapViews[0] 就是 mCurrentScrap

其数组长度应为 ViewTypeCount。因为针对不同的 ViewType,ListView 都要有一个专门的 ArrayList 链表来缓存它对应的 View

mActiveView:ArrayList 类型,被 layoutChildren() 用于缓存屏幕上的 View。

文章中提及的部分名词:项目中 ListView 使用了两个 ViewType,也就是有两种布局,其中第一种笔者在文中提及到时命名为 Item1,第二种称为 Item2。

初始化

c3f6497060089f1c7f3dd13cf87c0a0d.png

mActiveViews:长度为4。在笔者的手机上初始化时屏幕上只能容下4个 View

mScrapViews:长度为2。笔者设置了两种 ViewType,所以需要有两套缓存 View 的 ArrayList

mCurrentScrap/mScrapViews[0]:长度为0。此时缓存区肯定是0,因为没有滑动所以不存在缓存 View 一说。

mScrapViews[1]:长度为0。这个就更不解释啦。

触发第一个缓存

5e311317edfd1e435e0b41a8e7f01a40.gif

当 『1』 被移出屏幕的时候,mCurrentScrap/mScrapViews[0] 就要动手将它缓存起来啦,作为下一个进入屏幕的 View 的复用。在图上此时也多出了一句 the last one of mCurrentScrap's type is ItemX---number,为什么要关注 mCurrentScrap 的最后一个值?因为 RecycleBin 在滑动区域都是 Item1 的情况下,取出缓存的方式就是从末尾获取一个 View,所以我们需要关注一下末尾 View 的类型,但是实际上在整个过程中该值的意义也并不大,纯粹是为了展示离屏 Item 信息。至于 ItemX 后面的数字,则是废弃 View 中 TextView 中所显示的 text 了。所以第一个缓存是一个 Item1 类型的 TextView 显示为 1 的 View 被移出屏幕了。

同理:当『2』被滑出屏幕的时候,『2』这个 View 将会被缓存起来,此时屏幕上应该显示了 the last one of mCurrentScrap's type is Item1---2,各位读者可以试试。

屏幕内容数量最大化

屏幕继续下滑啊下滑~

14039a3244b4320eebfe5322ad310641.gif

屏幕下滑没多少就会突然发现 mCurrentScrap/mScrapView[0] 为 0 啦,这说明此时 RecycleBin 中没有缓存!因为此时屏幕中已经显示了 『2』~『6』共 5 个 View 了,之前的 『1』 已经被 『6』 复用了,所以不存在还有缓存了。实际上针对于 ViewType 只有一种的情况来说,RecycleBin 机制中的 mCurrentScrap/mScrapViews[0] 的大小永远是1。因为它至多只需要缓存一个 View,因为屏幕内容数量的最大值必定为初始时屏幕内容数量值 + 1,拿笔者的手机举例来说,初始值为4,屏幕内容数量的最大值则为 5。

触发 Item2 的显示

笔者将 Item1 的数量设置为 17,当我们挪到 17 继续下滑时将会发生什么情形?

ed8c8c3a0ae32b441e7f15442b304d01.gif

一切都在掌控之内。

继续触发

屏幕继续下滑,直至『14』被移出屏幕——

205c5c1f767f5358c34d8769e0f67fec.gif

当『14』被移出后,mCurrentScrap/mScrapViews[0] 的 size 从百年不变的 1 变成了 2。为什么?因为『13』 用不上了,新出来的 View 是 Item2 而不是 Item1,所以缓存只能无奈的加加加,而不能被复用。我们不妨移动到全屏为 Item2 ——

2a29449025f439868c9e8be2720ddc1b.gif

直至『17』移出屏幕,mCurrentScrap/mScrapViews[0] 的大小最终达到了 5。

总结

什么玩意儿,刚进 Item2 区域就总结啦?就总结啦!因为纯粹的 Item2 区域滑动和纯粹的 Item1 区域滑动情况是一样的;而 Item2 区域滑向 Item1 区域的情形与 Item1 区域滑向 Item2 区域的情形也是一样的。所以本文授人以渔的任务就完成了,剩下的就是各位读者实操捕鱼的过程了。

这篇关于android listview缓存机制,可视化 ListView 缓存机制,手摸手带你打通任督二脉的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/409449

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

【Tools】大模型中的自注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 自注意力机制(Self-Attention)是一种在Transformer等大模型中经常使用的注意力机制。该机制通过对输入序列中的每个元素计算与其他元素之间的相似性,

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动