0
点赞
收藏
分享

微信扫一扫

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

扒皮狼 2022-03-19 阅读 145

/**

  • 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
    mAtta

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

chedScrap.add(holder);
} else {
if (mChangedScrap == null) {
mChangedScrap = new ArrayList<ViewHolder>();
}
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);

如何做好面试突击,规划学习方向?

面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。

学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。

同时我还搜集整理2020年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节

image

在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多。

image

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

举报

相关推荐

0 条评论