想必大家对RecyclerView的4级缓存肯定都有所了解,那么RecyclerView为什么要是用4级缓存,每一级缓存在RecyclerView中都扮演了什么角色呢?
一级缓存 --> 减少绑定数据次数
RecyclerView 在滑动过程中为了实现平滑的移动,每次移动的距离都是10以下的像素,但是不管移动了多少,只要快速的滑动,就要频繁的遍历数据,但是如果数据遍历完数据再重新bindData 就是一个非常要命的操作,一级缓存attachList 的作用就是在滑动过程保存屏幕中有效的item 放入其中,那么在滑动时从一级缓存中获取的所有item的数据都是有效的,大大的保障了RecyclerView 滑动过程中的平滑性
二级缓存 --> 减少刚刚从相同部分滑出屏幕,再划入屏幕的item bindDate的次数
这个过程可以理解为,RecyclerView 向上滑动时,其中一个item 刚刚从一级缓存中被移除,此时RecyclerView 向下滑动让刚刚从一级缓存删除的item 重新显示在屏幕上,此时只需要遍历二级缓存cacheList, 这个list大小只有2个,而且遍历他的时机是有item需要被替换的情况下,所以遍历二级缓存的所消耗的代价还是相当可以的
我们可以一起分析一下一级缓存和二级缓存
我们先假设一个item的高度为100 而每次滑动的高度为10
在RecyclerView 向上快速滑动的过程就是第一次滑动10 将所有item 缓存到一级缓存 attachlist 中,反馈滑动距离时,由于没有item 出现替换或者消失的情况,不会遍历二级缓存,直接完整遍历一级缓存即可完成本次滑动,直到 滑动距离达到100,此时出现交替的情况下,假设二级缓存中存在数据,那么则会遍历二级缓存看看其中的数据是否和我们将要显示的数据匹配,如果匹配,则不需要重新绑定数据,如果不匹配则需要重新绑定数据
三级缓存 -->自定义缓存
第三级缓存是用来给复杂的操作用来做不同的缓存策略的,具体什么情况下能使用到这种缓存我也清楚,
四级缓存 --> 与listView 的viewholder 的用法一致,减少View inflate 的次数
其实在RecyclerView 中的第四级缓存从功能上整体上和ListView 的缓存是一致的,就是为了缓存View ,防止每次加载新的item再重新inflate 控件,他比ListView 强大之处就在可以让多个RecyclerView 公用一个4级缓存池,来达到加速显示的效果,我们还是以上一篇文章的图片为例
让所有的item公用一个缓存池必然会增加滑动时的流畅度