写点什么

地狱难度!字节跳动 Android 高级岗:说说 RecyclerView 的回收复用机制

用户头像
Android架构
关注
发布于: 2 小时前

回收复用,细分下来,是两个概念: 回收复用 有如下几个问题。


回收的是什么?复用的又是什么?


回收到哪里去了?复用又是从哪里拿?


什么时候回收?什么时候复用?

图解编程

看图之前,先明确一个概念,RecyclerView是支持滑动,那么一定可以确定一点------回收和复用一定是基于滑动事件的,不然一个静止的view,谈不上回收复用.既然如此,那么我们探索的起点,应该是 RecyclerViewonTouchEventmove事件


回收当一个itemView从可见到不可见时,RecyclerView利用回收机制,将它存放到了内存中,以便其他item出现时,不用每次都去new一个新的itemView,而是只去 onBindViewHolder绑定数据就行了.

大概流程如下:


复用:滑动过程中出现了新的 itemView,不用每次都去 new,而是优先从缓存中去拿,缓存不能满足需求,再去 执行 onCreateViewHolder 创建新的 itemView 并封装到 viewHolder 中

大概流程如下:

如果追踪一遍上面的源码,那么就可以回答之前的问题

回收的是什么?复用的又是什么?回收到哪里去了?复用又是从哪里拿?


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


答:回收和复用的都是ViewHolder对象,在RecyclerView的内部类Recycler中,可以看到四重缓存中的关键数据结构都和ArrayList<ViewHolder>有关,ViewHolderitemView的封装。说明无论回收还是复用,都是以ViewHolder为单位去存取。


什么时候回收?什么时候复用?

答:我们追踪程序,是以 RecyclerViewonTouchEvnet move事件为起点。结合追踪到的源码,可以发现,回收发生在 itemView消失的时候,复用则发生在 itemView由不可见到可见的时候

其他重要结论

RecyclerView本身只是一个容器(RecyclerView extends ViewGroup), 它的onLayout方法重写,决定了itemView的排布方式,追踪进去,onLayout ==>dispatchLayout()==> dispatchLayoutStep1() dispatchLayoutStep2() dispatchLayoutStep3(); 看来layout过程分为三步,而进入这 3 个方法,都能找到 mLayout.XXX方法,这是因为 RecyclerView本身只是一个ViewGroup,它的布局方式,全权委托给了LayoutManager这个内部类的实现,而这个实现的关键方法则是:onLayoutChildren,重写这个方法将会决定RecyclerViewitemView如何布局


看过了源码,在去理解之前写的一些RecyclerViewAdapter,认识深刻了很多,为什么它有这么几个方法 onCreateViewHolder,onBindViewHolder, 为什么Adapter的类定义时要这样 Adapter<VH extends ViewHolder>. 因为AdapterRecyclerView的数据和itemView的连接层,itemView都是要封装到ViewHolder中的,绑定数据就要和ViewHolder发生关系


RecyclerView这个东西,如果看成是一个知识体系,那么它有这么几个关键因素:1. 容器 ,RecyclerView本身 2. 布局管理器,RecyclerView.LayoutManager3. 回收复用机制, RecyclerView.Recycler> 4. 适配器,RecyclerView.Adapter当然,它的内部类当然不止这么几个,各有各的作用,今天探索复用机制,就涉及到了这么几个。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
地狱难度!字节跳动Android高级岗:说说RecyclerView的回收复用机制