编程语言
首页 > 编程语言> > Android从源码分析RecyclerView四级缓存复用机制一(缓存ViewHolder)

Android从源码分析RecyclerView四级缓存复用机制一(缓存ViewHolder)

作者:互联网

//一级缓存中用来存储屏幕中显示的ViewHolder
final ArrayList mAttachedScrap = new ArrayList<>();
ArrayList mChangedScrap = null;
//二级缓存中用来存储屏幕外的ViewHolder
final ArrayList mCachedViews = new ArrayList();
//暂可忽略 mAttachedScrap的不可变视图
private final List
mUnmodifiableAttachedScrap = Collections.unmodifiableList(mAttachedScrap);

private int mRequestedCacheMax = DEFAULT_CACHE_SIZE;
//mCachedViews屏幕外缓存的存储上限默认为DEFAULT_CACHE_SIZE也就是2,可变
int mViewCacheMax = DEFAULT_CACHE_SIZE;
//四级缓存当屏幕外缓存的大小大于2,便放入mRecyclerPool中缓存
RecycledViewPool mRecyclerPool;
//三级缓存自定义缓存,自己定义的缓存规则
private ViewCacheExtension mViewCacheExtension;
//默认屏幕外缓存大小
static final int DEFAULT_CACHE_SIZE = 2;
//…

2.再看一下主要的方法调用流程,从RecyclerView的onMeasure方法开始一直到三个存储的地方一级,二级和四级缓存,别问为啥没有mViewCacheExtension,问就是这个你需要自己去存 在这里插入图片描述

3.源码分析,本文对重点方法和重点代码进行分析(流程最好自己去跟一下)。

/**

① 分析一级缓存

/**

② 分析二级缓存

/**

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

CachedViewAt(0);
cachedViewSize–;
}
//…计算targetCacheIndex的下标 让mCachedViews满足队列先进先出原则
mCachedViews.add(targetCacheIndex, holder);
cached = true;
}
if (!cached) {
//…如果二级缓存没有存储则添加到四级缓存
addViewHolderToRecycledViewPool(holder, true);
recycled = true;
}
} else {
//…
}
//…
}
/**

ViewHolder viewHolder = mCachedViews.get(cachedViewIndex);
//Viewholder存储到四级缓存
addViewHolderToRecycledViewPool(viewHolder, true);
//Viewholder在四级缓存存储后移除mCachedViews中对应的Viewholder
mCachedViews.remove(cachedViewIndex);
}

③分析四级缓存

/**

③分析四级缓存

/**

标签:viewHolder,ViewHolder,holder,缓存,RecyclerView,源码,mCachedViews
来源: https://blog.csdn.net/m0_64603929/article/details/121709392