RecyclerView源码分析之四级缓存机制

本文深入剖析了RecyclerView在Android中的高性能表现,重点在于其四级缓存机制,包括ViewHolder的回收和复用。从滑动时的函数调用链开始,详细解释了tryGetViewHolderForPositionByDeadline方法如何从一级缓存到四级缓存逐级查找并复用ViewHolder,确保高效利用资源。
摘要由CSDN通过智能技术生成

众所周知,RecyclerView在android中实现列表是性能非常好的,那么性能好的原因在哪里呢?关键还是在它在处理view时的回收和复用。列表在滑动的时候,会进行itemView的回收和复用,那么我们就从滑动回调即onTouchEvent来入手分析。

基本概念

  1. ViewHolder: View的容器,一项View就对应一个ViewHolder
  2. Recyler:RecyclerView的内部类,主要负责View的回收和复用
  3. LinearLayoutManager: RecyclerView的线性布局管理器

滑动时函数调用链

在这里插入图片描述

四级缓存机制

层级 缓存变量 缓存名 容量 数据结构 缓存用途
1 mChangeScrap与 mAttachedScrap 可见缓存 x ArrayList 用于布局过程中屏幕可见表项的回收和复用
2 mCachedViews 缓存列表 2 ArrayList 用于移出屏幕表项的回收和复用,不会清空数据
3 mViewCacheExtension 自定义缓存 x
4 RecycledViewPool 缓存池 5 SparseArray 用于移出屏幕表项的回收和复用,会将ViewHolder的数据重置

回收的关键方法分析

## RecyclerView.java
void recycleViewHolderInternal(ViewHolder holder) {
	...
	if (forceRecycle || holder.isRecyclable()) {
                if (mViewCacheMax > 0
                        && !holder.hasAnyOfTheFlags(ViewHolder.FLAG_INVALID
                                | ViewHolder.FLAG_REMOVED
                                | ViewHolder.FLAG_UPDATE
                                | ViewHolder.FLAG_ADAPTER_POSITION_UNKNOWN)) 
	// 1) 先尝试放到cacheView中
                    int cachedViewSize = mCachedViews.size();
                    if (cachedViewSize >= mViewCacheMax && cachedViewSize > 0) {
                        // 如果 mCachedViews 已经满了,把第0个位置的移除并放到 缓存池中
                        recycleCachedViewAt(0);
                        cachedViewSize--;
                    }
                    if (!cached) {
                    // 2) 如果CacheView中没放进去,
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值