Android四级缓存,RecyclerView 源码四级缓存原理

入口

我们从使用功能上去读取源码,通常的用法是这个样子

-> 我们设置layoutmanager,GridLayouManager 继承LinearLayoutManager,所以我们就LinearLayoutManager 为基准查看

rv.layoutManager = GridLayoutManager(this,5)

rv.addItemDecoration(DividerItemDecoration(this,LinearLayout.VERTICAL))

-> kotlin 写法给数据源

var result: List = (1..1000).map { it.toString() }

rv.adapter = CustomAdapter(this, result as MutableList)

ac1947204f70

recycler.png

看复用机制的话,我们从滑动看起。

滑动的处理时间,一般就在onTouchEvent 的 MotionEvent.Move事件看起

入口:滑动 Move 事件 --> scrollByInternal --> scrollStep --> mLayout.scrollVerticallyBy (RecyclerView 用了模板方法默认返回0,所以我们看他的实现方法在LineaLayoutManager里面找)

--> scrollBy -->(consumed) fill --> (while循环)layoutChunk --> layoutState.next --> addView(view);

layoutState.next --> getViewForPosition --> tryGetViewHolderForPositionByDeadline -->

tryGetViewHolderForPositionByDeadline 和缓存分析

怎么从集合中去获取:tryGetViewHolderForPositionByDeadline,分几种情况去获取ViewHolder

getChangedScrapViewForPosition -- mChangeScrap 与动画相关

getScrapOrHiddenOrCachedHolderForPosition -- mAttachedScrap 、mCachedViews

getScrapOrCachedViewForId -- mAttachedScrap 、mCachedViews (ViewType,itemid)

mViewCacheExtension.getViewForPositionAndType -- 自定义缓存 -- (使用情况:局部刷新??)

getRecycledViewPool().getRecycledView -- 从缓冲池里面获取

RecycledViewPool -- 缓存池

ViewHolder -- 包装View的 --- ItemView

当没有缓存的时候??--- mAdapter.createViewHolder --》 onCreateViewHolder

多级缓存的目的 -- 为了性能

创建ViewHolder 后 绑定: tryBindViewHolderByDeadline--》 mAdapter.bindViewHolder--》onBindViewHolder

回收机制,缓存机制

回收(缓存)机制:看这一个情况--- ViewHolder

LinearLayoutManager.onLayoutChildren --> detachAndScrapAttachedViews --> scrapOrRecycleView

--> 1.recycler.recycleViewHolderInternal(viewHolder); -- 处理 CacheView 、RecyclerViewPool 的缓存

--> 1.ViewHodler改变 不会进来 -- 先判断mCachedViews的大小

--> mCachedViews.size 大于默认大小 --- recycleCachedViewAt

--- >addViewHolderToRecycledViewPool --- 缓存池里面的数据都是从mCachedViews里面出来的

--> 2.addViewHolderToRecycledViewPool --> getRecycledViewPool().putRecycledView(holder);

--> scrap.resetInternal(); ViewHolder 清空

--> 2.recycler.scrapView(view);

ac1947204f70

recycler_cache.png

mCachedViews当前的大小 如果 大于等于mViewCacheMax(默认的CachedViews的大小)

ViewType --

缓存池 里面保存 只是 ViewHolder 类型 没有数据

去查找缓存和复用的一种情况

入口:复用:RecyclerView.onLayout --> dispatchLayout --》 dispatchLayoutStep2 --》 onLayoutChildren --》 fill

缓存:fill -->recycleByLayoutState-->recycleViewsFromStart --> recycleChildren

--> removeAndRecycleViewAt --> recycler.recycleView

--> recycler.recycleViewHolderInternal(viewHolder); -- 处理 CacheView 、RecyclerViewPool 的缓存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值