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

总结

其实要轻松掌握很简单,要点就两个:

  1. 找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。
  2. 多练。 (视频优势是互动感强,容易集中注意力)

你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。下面资料部分截图是我花费几个月时间整理的,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

正文

大家都知道**RecyclerView**有回收复用机制,那么回收复用机制是如何作用的?
回收复用,细分下来,是两个概念: 回收复用 有如下几个问题。

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

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

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

图解编程

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

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

大概流程如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

大概流程如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

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

答:回收和复用的都是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.LayoutManager
3. 回收复用机制, RecyclerView.Recycler> 4. 适配器,RecyclerView.Adapter
当然,它的内部类当然不止这么几个,各有各的作用,今天探索复用机制,就涉及到了这么几个。

最后

针对于上面的问题,我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料。
(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。
Android进阶视频+面试资料部分截图

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值