RecyclerView的四级缓存-初探

RecyclerView的缓存机制

RecyclerView与 ListView 的缓存机制原理大致相似, 滑动的时候,离屏的 ItemView 被回收至缓存,入屏的 ItemView 则会优先从缓存中获取。是 ListView 与 RecyclerView 的实现细节有差异。

Tips:ListView只有两级缓存,RecyclerView名义上是有四级缓存,但三级缓存是空实现,需自定义,实质是有三级缓存。

ListView的缓存机制:

istView 是继承于 AbsListView ,RecycleBin 是 AbsListView 的内部类,其作用是通过两级缓存来缓存 view。

一级缓存:mActiveViews
第一级缓存,这些 View 是布局过程开始时屏幕上的 view,layout 开始时这个数组被填充,layout 结束,mActiveViews 中的 View 移动到 mScrapView,意义在于快速重用屏幕上可见的列表项 ItemView,而不需要重新 createView 和 bindView。

二级缓存:mScrapView
第二级缓存,mScrapView 是多个 List 组成的数据,数组的长度为 viewTypeCount,每个 List 缓存不同类型 Item 布局的 View,其意义在于缓存离开屏幕的 ItemView,目的是让即将进入屏幕的 itemView 重用,当 mAdapter 被更换时,mScrapViews 则被清空。

RecyclerView 四级缓存

RecyclerView 也有一个类专门来管理缓存,不过与 ListView 不同的是,RecylerView 缓存的是 ViewHolder,而且实现的是四级缓存。

一级:Scrap

对应ListView 的一级缓存,快速重用屏幕上可见的 ViewHolder。

简而言之,屏幕内显示的。

二级:Cached

对应ListView的二级缓存,如果仍依赖于 RecyclerView(比如已经滑出可视范围,但还没有被移除掉),但已经被标记移除的 ItemView 集合被添加到 mAttachedScrap 中。然后如果 mAttachedScrap 中不再依赖时会被加入到 mCachedViews 中,默认缓存 2 个 ItemView,RecycleView 从这里获取的缓存时,如果数据源不变的情况下,无需重新 bindView。

简而言之,linearlayoutmanager来说cached缓存默认大小为2,起到的作用就是rv滑动时刚被移出屏幕的viewholer的收容所。

三级:CacheExtension

第三级缓存,其实是一个抽象静态类,用于充当附加的缓存池,当 RecyclerView 从 mCacheViews 找不到需要的 View 时,将会从 ViewCacheExtension 中寻找。不过这个缓存是由开发者维护的,如果没有设置它,则不会启用。通常我们也不会设置它,除非有特殊需求,比如要在调用系统的缓存池之前,返回一个特定的视图,才会用到它。

简而言之,这是一个自定义的缓存,没错rv是可以自定义缓存行为的。
目前来说这还只是个空实现而已,从这点来看其实rv所说的四级缓存本质上还只是三级缓存。

四级:RecycledViewPool(最强大)

它是一个缓存池,实现上,是通过一个默认为 5 大小的 ArrayList 实现的。这一点,同 ListView 的 RecyclerBin 这个类一样。每一个 ArrayList 又都是放在一个 Map 里面的,SparseArray 用两个数组用来替代 Map。

把所有的 ArrayList 放在一个 Map 里面,这也是 RecyclerView 最大的亮点,这样根据 itemType 来取不同的缓存 Holder,每一个 Holder 都有对应的缓存,而只需要为这些不同 RecyclerView 设置同一个 Pool 就可以了。

简而言之, pool一般会和cached配合使用,这么来说,cached存不下的会被保存到pool中毕竟cached默认容量大小只有2,但是pool容量 也是有限的当保存满之后再有viewholder到来的话就只能会无情抛弃掉,它也有一个默认的容量大小

  privatestaticfinalintDEFAULT_MAX_SCRAP = 5;

你可能感兴趣的:(RecyclerView的四级缓存-初探)