75.RecycleView四级缓存

2020-08-13  本文已影响0人  SlideException

https://www.jianshu.com/p/1d2213f303fc

1.mAttachedScrap,mChangeScrap
2.mCacheViews
3.mViewCacheExtension
4.mRecycleViewPool
各级缓存作用:
Scrap:
scrap是用来保存被rv移除掉但最近又马上要使用的缓存,比如rv自带item的动画效果,本质上就是计算item的偏移量然后执行属性动画的过程,这中间可能就涉及到需要将动画之前的item保存下位置信息,动画后的item再保存下位置信息,然后利用这些位置数据生成相应的属性动画,如何保存这些viewholer呢,就需要使用到scrap了,因为这些viewholer数据上是没有改变的,只是位置改变而已,所以放置到scrap最为合适。稍微仔细看的话就能发现scrap缓存有两个成员mChangedScrap和mAttachedScrap,它们保存的对象有些不一样,一般调用adapter的notifyItemRangeChanged被移除的viewholder会保存到mChangedScrap,其余的notify系列方法(不包括notifyDataSetChanged)移除的viewholder会被保存到mAttachedScrap中

cached:
也是一个非常重要的缓存,就LinearLayoutManager来说,cached缓存默认大小为2,他的容量非常小,所起到的作用就是rv滑动时候刚被移出屏幕的viewholder的收容所,因为rv会认为刚被移出屏幕
的viewholder可能马上就会使用到,所以不会立即设置为无效viewholder,会将他们保存到cached中,但又不能将所有移除屏幕的viewholder视为有效viewholder,所以他的默认容量只有两个,可以通过setViewCacheSize(int viewCount)方法修改

extension:
第三级缓存,这是一个自定义缓存,rv可以自定义缓存行为,在这里你可以决定缓存的保存逻辑,但是这么个自定义缓存一般都没有见过具体的使用场景,而且自定义缓存需要你对rv中的源码非常熟悉才行,否则在rv执行item动画,或者执行notify的一系列方法后你的自定义缓存是否还能有效就是一个值得考虑的问题,所以一般不太推荐使用该缓存,更多的我觉得这可能是google自已留着方便扩展来使用的,目前来说这还只是个空实现而已,从这点来看其实rv所说的四级缓存本质上还只是三级缓存。

pool:
又一个重要的缓存,这也是唯一一个我们开发者可以方便设置的一个(虽然extension也能设置,但是难度大),而且设置方式非常简单,new一个pool传进去就可以了,其他的都不用我们来处理,google已经给我们料理好后事了,这个缓存保存的对象就是那些无效的viewholder,虽然说无效的viewholder上的数据是无效的,但是他的rootview还是可以拿来使用的,这也是为什么最早listview有一个convertView的原因,当然这种机制也被rv很好的继承下来了,pool一般会和cached配合使用,这么来说cached存不下的就会被保存到pool中,毕竟cached的默认容量大小只有2,但是pool容量也是有限的当保存满之后再有viewholder到来的话就只能会无情抛弃掉,它也有一个默认的容量大小
private static final int DEFAULT_MAX_SCRAP = 5;
int mMaxScrap = DEFAULT_MAX_SCRAP;
这个大小也是可以通过调用方法来改变,具体看应用场景,一般来说正常使用的话使用默认大小即可。

rv优化:

上一篇下一篇

猜你喜欢

热点阅读