android进阶篇02、RecyclerView回收复用机制源码解析,h5移动端开发进行定位

public void removeAndRecycleViewAt(int index, @NonNull Recycler recycler) {

final View view = getChildAt(index);

removeViewAt(index);

recycler.recycleView(view); //1

}

5、Recycler -> recycleView

如下所示,注释1处表示又会调用recycleViewHolderInternal;

public void recycleView(@NonNull View view) {

、、、

recycleViewHolderInternal(holder); //1

}

6-1 RecyclerView # Recycler

在分析recycleViewHolderInternal方法之前,我们先简单分析一下RecyclerView的两个内部类Recycler类和RecyclerViewPool;

RecyclerView # Recycler

Recycler如下所示,注释1和注释2是一级缓存,其实就是泛型为ViewHolder的ArrayList;注释3就是二级缓存,注释4处的mViewCacheMax表示二级缓存的最大容量为2;注释5就是四级缓存RecycledViewPool;注释6就是第三级缓存,也就是自定义缓存;

public final class Recycler {

final ArrayList mAttachedScrap = new ArrayList<>(); //1

ArrayList mChangedScrap = null; //2

final ArrayList mCachedViews = new ArrayList(); //3

private final List

mUnmodifiableAttachedScrap = Collections.unmodifiableList(mAttachedScrap);

private int mRequestedCacheMax = DEFAULT_CACHE_SIZE;

int mViewCacheMax = DEFAULT_CACHE_SIZE; //4

RecycledViewPool mRecyclerPool; //5

private ViewCacheExtension mViewCacheExtension; //6

static final int DEFAULT_CACHE_SIZE = 2; //7

、、、

}

RecyclerView # RecycledViewPool

RecycledViewPool如下所示,先看注释2处的内部类ScrapData,注释3处的mScrapHeap就是缓存ViewHolder的ArrayList,注释4处表示最大容量为5,即可以缓存ViewHolder的个数为5;注释5处mScrap是一个SparseArray,其泛型为内部类ScrapData,这表示什么意思呢?就是说RecyclerViewPool对每种类型的ViewHolder最大缓存个数为5,然后可以缓存多种ViewHolder类型;

public static class RecycledViewPool {

private static final int DEFAULT_MAX_SCRAP = 5; //1

static class ScrapData { //2

final ArrayList mScrapHeap = new ArrayList<>(); //3

int mMaxScrap = DEFAULT_MAX_SCRAP; //4

long mCreateRunningAverageNs = 0;

long mBindRunningAverageNs = 0;

}

SparseArray mScrap = new SparseArray<>(); //5

、、、

}

6-2 Recycler -> recycleViewHolderInternal

在recycleViewHolderInternal方法中才是执行真正的回收操作,主要是使用第二级缓存mCachedViews和第四级缓存RecyclerViewPool;注释1、2处表示mCachedViews容量满了之后会调用recycleCachedViewAt方法,然后将size–;注释3处表示往mCachedViews添加;注释

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值