1、回收什么?复用什么?
2、回收到哪里去?从哪里获得复用?
3、什么时候回收?什么时候复用?
当我们滑动的时候什么时候时候复用、回收呢:
滑动复用入口(从集合中取):onTouchEvent的move-->scrollByInternal-->scrollStep-->mLayout.scrollVerticallyBy-->scrollBy-->fill-->layoutChunk-->layoutState.next(recycler)-->addView(view);
这样就addview了,那么这么从集合中取呢:
layoutState.next(recycler)-->recycler.getViewForPosition-->tryGetViewHolderForPositionByDeadline
1、getChangedScrapViewForPosition-->mChangedScrap.get(i) 与动画相关
2、getScrapOrHiddenOrCachedHolderForPosition>mAttachedScrap.get(i)
、mCachedViews.get(i)
3、getScrapOrCachedViewForId-->mAttachedScrap.get(i)、mCachedViews.get(i)
4、mViewCacheExtension .getViewForPositionAndType-->自定义缓存的情况
5、getRecycledViewPool().getRecycledView(type)--从缓存池中获取
滑动回收:
入口:LinearLayoutManager.onLayoutChildren-->detachAndScrapAttachedViews-->scrapOrRecycleView
-->1、recycleViewHolderInternal--处理cacheview、recycleviewpool的缓存
1)ViewHodler改变 不会进来 -- 先判断mCachedViews的大小
-->cachedViewSize = mCachedViews.size() 默认大小2-->recycleCachedViewAt
-->addViewHolderToRecycledViewPool、mCachedViews.remove(cachedViewIndex)
这个地方会把CacheView中的viewholder拿出来缓存到recycleviewpool中,并且从cacheview中移出:
2)addViewHolderToRecycledViewPool-->getRecycledViewPool().putRecycledView(holder)-->scrap.resetInternal()清空viewholder,只保存viewholder的类型,不保存数据-->scrapHeap.add(scrap)
-->2、recycler.scrapView(view)
recycleview布局时候的复用回收:
复用入口:
RecycleView..onLayout-->dispatchLayout()-->dispatchLayoutStep2-->mLayout.onLayoutChildren(mRecycler, mState)-->fill。之后就和滑动的流程一样的
回收入口:
fill -->recycleByLayoutState-->recycleViewsFromStart --> recycleChildren--> removeAndRecycleViewAt --> recycler.recycleView-->recycler.recycleViewHolderInternal(viewHolder); -- 处理 CacheView 、RecyclerViewPool 的缓存。
总结:
四级缓存:
1、mChangeScrap与mAttachedScrap:用来缓存还在屏幕内的viewholder
2、mCacheViews:用来缓存移出屏幕外的viewholder
3、mViewChacheExtension:开发给用户自己扩展的缓存,需要用户自己管理view的创建和缓存
4、RecycleViewPool:viewholder缓存池
Scrap、cacheview、recycleviewpool