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

//三级缓存自定义缓存,自己定义的缓存规则
private ViewCacheExtension mViewCacheExtension;
//默认屏幕外缓存大小
static final int DEFAULT_CACHE_SIZE = 2;
//…

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

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

/**

  • 5.RecyclerView.scrapOrRecycleView
    */
    private void scrapOrRecycleView(Recycler recycler, int index, View view) {
    final ViewHolder viewHolder = getChildViewHolderInt(view);
    //只展示重点代码…
    if (viewHolder.isInvalid() && !viewHolder.isRemoved()
    && !mRecyclerView.mAdapter.hasStableIds()) {
    removeViewAt(index);
    //这里调用到二级和四级缓存
    recycler.recycleViewHolderInternal(viewHolder);
    } else {
    detachViewAt(index);
    //这里调用到一级缓存
    recycler.scrapView(view);
    mRecyclerView.mViewInfoStore.onViewDetached(viewHolder);
    }
    }

① 分析一级缓存

/**

  • 13.RecyclerView.scrapView
    */
    void scrapView(View view) {
    final ViewHolder holder = getChildViewHolderInt(view);
    if (holder.hasAnyOfTheFlags(ViewHolder.FLAG_REMOVED | ViewHolder.FLAG_INVALID)
    || !holder.isUpdated() || canReuseUpdatedViewHolder(holder)) {
    //…
    holder.setScrapContainer(this, false);
    //缓存adapter其他notify系列方法(包括notifyDataSetChanged)被移除的ViewHolder
    mAttachedScrap.add(holder);
    } else {
    if (mChangedScrap == null) {
    mChangedScrap = new ArrayList();
    }
    holder.setScrapContainer(this, true);
    //缓存adapter的notifyItemRangeChanged被移除的ViewHolder
    mChangedScrap.add(holder);
    }
    }

② 分析二级缓存

/**

  • 6.RecyclerView.recycleViewHolderInternal
    /
    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)) {
    // Retire oldest cached view
    int cachedViewSize = mCachedViews.size();
    //判断mCachedViews的大小是否大于2
    if (cachedViewSize >= mViewCacheMax && cachedViewSize > 0) {
    //重点分析一
    recycleCachedViewAt(0);
    cachedViewSize–;
    }
    //…计算targetCacheIndex的下标 让mCachedViews满足队列先进先出原则
    mCachedViews.add(targetCacheIndex, holder);
    cached = true;
    }
    if (!cached) {
    //…如果二级缓存没有存储则添加到四级缓存
    addViewHolderToRecycledViewPool(holder, true);
    recycled = true;
    }
    } else {
    //…
    }
    //…
    }
    /
    *
  • 重点分析一:7.RecyclerView.recycleViewHolderInternal
  • 作用:如果mCachedViews的大小大于2则内部调用addViewHolderToRecycledViewPool方法添加到RecycledViewPool中
    */
    void recycleCachedViewAt(int cachedViewIndex) {

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

③分析四级缓存

/**

  • 8.RecyclerView.recycleViewHolderInternal
    /
    void addViewHolderToRecycledViewPool(@NonNull ViewHolder holder, boolean dispatchRecycled) {
    clearNestedRecyclerViewIfNotNested(holder);
    //…
    if (dispatchRecycled) {
    dispatchViewRecycled(holder);
    }
    holder.mOwnerRecyclerView = null;
    //存储到RecycledViewPool中
    getRecycledViewPool().putRecycledView(holder);
    }
    /
    *
  • 9.RecyclerView.recycleViewHolderInternal
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

结尾

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

这里放上一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

链图片转存中…(img-d8JeVAQE-1713836511461)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 27
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值