地狱难度!字节跳动Android高级岗:说说RecyclerView的回收复用机制
前言
学习源码,研究源码编程思想,是程序开发者进阶的必经之路。然而,进了源码世界,就像是进了迷失森林,没有地图,迟早要死在里面。有个地图会好很多。
此类文集,专门用图解编程的方式,来讲解一个知识点,从一个点切入,理解切入点之后,再进行知识发散。
路漫漫,进阶之路不好走。与众君共勉之。
正文
大家都知道RecyclerView
有回收复用机制,那么回收复用机制是如何作用的?
回收复用,细分下来,是两个概念: 回收 和 复用 有如下几个问题。
回收的是什么?复用的又是什么?
回收到哪里去了?复用又是从哪里拿?
什么时候回收?什么时候复用?
图解编程
看图之前,先明确一个概念,
RecyclerView
是支持滑动,那么一定可以确定一点------回收和复用一定是基于滑动事件的,不然一个静止的view
,谈不上回收复用.
既然如此,那么我们探索的起点,应该是RecyclerView
的onTouchEvent
的move
事件
回收:当一个
itemView
从可见到不可见时,RecyclerView
利用回收机制,将它存放到了内存中,以便其他item
出现时,不用每次都去new
一个新的itemView
,而是只去onBindViewHolder
绑定数据就行了.大概流程如下:
复用:滑动过程中出现了新的itemView,不用每次都去new,而是优先从缓存中去拿,缓存不能满足需求,再去 执行onCreateViewHolder创建新的itemView并封装到viewHolder中
大概流程如下:
如果追踪一遍上面的源码,那么就可以回答之前的问题
回收的是什么?复用的又是什么?
回收到哪里去了?复用又是从哪里拿?答:回收和复用的都是
ViewHolder
对象,在RecyclerView
的内部类Recycler
中,可以看到四重缓存中的关键数据结构都和ArrayList<ViewHolder>
有关,ViewHolder
是itemView
的封装。
说明无论回收还是复用,都是以ViewHolder
为单位去存取。
什么时候回收?什么时候复用?
答:我们追踪程序,是以
RecyclerView
的onTouchEvnet
move
事件为起点。结合追踪到的源码,可以发现,回收发生在itemView
消失的时候,复用则发生在itemView
由不可见到可见的时候
其他重要结论
RecyclerView
本身只是一个容器(RecyclerView extends ViewGroup
), 它的onLayout
方法重写,决定了itemView
的排布方式,追踪进去,onLayout
>dispatchLayout()
>dispatchLayoutStep1()
dispatchLayoutStep2()
dispatchLayoutStep3();
看来layout
过程分为三步,而进入这3个方法,都能找到mLayout.XXX
方法,这是因为RecyclerView
本身只是一个ViewGroup
,它的布局方式,全权委托给了LayoutManager
这个内部类的实现,而这个实现的关键方法
则是:onLayoutChildren
,重写这个方法将会决定RecyclerView
的itemView
如何布局
看过了源码,在去理解之前写的一些
RecyclerView
的Adapter
,认识深刻了很多,为什么它有这么几个方法onCreateViewHolder
,onBindViewHolder
, 为什么Adapter
的类定义时要这样Adapter<VH extends ViewHolder>
. 因为Adapter
是RecyclerView
的数据和itemView
的连接层,itemView
都是要封装到ViewHolder
中的,绑定数据就要和ViewHolder
发生关系
RecyclerView
这个东西,如果看成是一个知识体系,那么它有这么几个关键因素:
1. 容器 ,RecyclerView
本身
2. 布局管理器,RecyclerView.LayoutManager
3. 回收复用机制,RecyclerView.Recycler
> 4. 适配器,RecyclerView.Adapter
当然,它的内部类当然不止这么几个,各有各的作用,今天探索复用机制,就涉及到了这么几个。
Android 开发相关源码精编解析
随着Android开发行业逐渐饱和,对Android开发者的面试要求也越来越高,是否掌握底层源码,便是考验一名Android开发者的重要一环。面试被问到源码问题答不出来,会掉身价、砍薪资尚且不谈,甚至连面试都过不了!
网上各类源码解析的文章博客五花八门、良莠不齐。杂乱、要么内容质量太浅,零散、碎片化,总看着看着就衔接不上了。
所以特意将我在疫情期间花了4个月整理出来的《Android 开发相关源码精编解析》分享出来大家
由于内容较多,避免影响到大家的阅读体验,在此只截图展示目录部分,487详细完整版的《Android 开发相关源码精编解析》电子书文档领取方式:点赞+关注,然后私信关键词 【666】即可加我的个人微信私发给你(无偿)。也欢迎大家找我探讨Android技术问题~
目录:一共18节,487页PDF,包括MMKV 源码,ARouter 源码,AsyncTask 源码,Volley 源码,Retrofit 源码,OkHttp 源码,ButterKnife 源码,Okio 源码,SharedPreferences 源码,EventBus 源码,Android 自定义注解初探,View 的工作机制源码分析,Android 触摸事件分发机制源码分析,Android 按键事件分发机制源码分析,深入解析 Handler 源码,深入解析 Binder 源码,深入解析 JNI 源码,深入解析 Glide 源码。
《Android 开发相关源码精编解析》电子书文档领取方式已上传到我的GitHub,无偿分享的
对文章有何见解,或者有何技术问题,欢迎在评论区给我留言讨论,都会回复的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律