Android四级缓存,RecyclerView 源码四级缓存原理
入口
我們從使用功能上去讀取源碼,通常的用法是這個(gè)樣子
-> 我們?cè)O(shè)置layoutmanager,GridLayouManager 繼承LinearLayoutManager,所以我們就LinearLayoutManager 為基準(zhǔn)查看
rv.layoutManager = GridLayoutManager(this,5)
rv.addItemDecoration(DividerItemDecoration(this,LinearLayout.VERTICAL))
-> kotlin 寫法給數(shù)據(jù)源
var result: List = (1..1000).map { it.toString() }
rv.adapter = CustomAdapter(this, result as MutableList)
recycler.png
看復(fù)用機(jī)制的話,我們從滑動(dòng)看起。
滑動(dòng)的處理時(shí)間,一般就在onTouchEvent 的 MotionEvent.Move事件看起
入口:滑動(dòng) Move 事件 --> scrollByInternal --> scrollStep --> mLayout.scrollVerticallyBy (RecyclerView 用了模板方法默認(rèn)返回0,所以我們看他的實(shí)現(xiàn)方法在LineaLayoutManager里面找)
--> scrollBy -->(consumed) fill --> (while循環(huán))layoutChunk --> layoutState.next --> addView(view);
layoutState.next --> getViewForPosition --> tryGetViewHolderForPositionByDeadline -->
tryGetViewHolderForPositionByDeadline 和緩存分析
怎么從集合中去獲取:tryGetViewHolderForPositionByDeadline,分幾種情況去獲取ViewHolder
getChangedScrapViewForPosition -- mChangeScrap 與動(dòng)畫相關(guān)
getScrapOrHiddenOrCachedHolderForPosition -- mAttachedScrap 、mCachedViews
getScrapOrCachedViewForId -- mAttachedScrap 、mCachedViews (ViewType,itemid)
mViewCacheExtension.getViewForPositionAndType -- 自定義緩存 -- (使用情況:局部刷新??)
getRecycledViewPool().getRecycledView -- 從緩沖池里面獲取
RecycledViewPool -- 緩存池
ViewHolder -- 包裝View的 --- ItemView
當(dāng)沒有緩存的時(shí)候??--- mAdapter.createViewHolder --》 onCreateViewHolder
多級(jí)緩存的目的 -- 為了性能
創(chuàng)建ViewHolder 后 綁定: tryBindViewHolderByDeadline--》 mAdapter.bindViewHolder--》onBindViewHolder
回收機(jī)制,緩存機(jī)制
回收(緩存)機(jī)制:看這一個(gè)情況--- ViewHolder
LinearLayoutManager.onLayoutChildren --> detachAndScrapAttachedViews --> scrapOrRecycleView
--> 1.recycler.recycleViewHolderInternal(viewHolder); -- 處理 CacheView 、RecyclerViewPool 的緩存
--> 1.ViewHodler改變 不會(huì)進(jìn)來 -- 先判斷mCachedViews的大小
--> mCachedViews.size 大于默認(rèn)大小 --- recycleCachedViewAt
--- >addViewHolderToRecycledViewPool --- 緩存池里面的數(shù)據(jù)都是從mCachedViews里面出來的
--> 2.addViewHolderToRecycledViewPool --> getRecycledViewPool().putRecycledView(holder);
--> scrap.resetInternal(); ViewHolder 清空
--> 2.recycler.scrapView(view);
recycler_cache.png
mCachedViews當(dāng)前的大小 如果 大于等于mViewCacheMax(默認(rèn)的CachedViews的大小)
ViewType --
緩存池 里面保存 只是 ViewHolder 類型 沒有數(shù)據(jù)
去查找緩存和復(fù)用的一種情況
入口:復(fù)用:RecyclerView.onLayout --> dispatchLayout --》 dispatchLayoutStep2 --》 onLayoutChildren --》 fill
緩存:fill -->recycleByLayoutState-->recycleViewsFromStart --> recycleChildren
--> removeAndRecycleViewAt --> recycler.recycleView
--> recycler.recycleViewHolderInternal(viewHolder); -- 處理 CacheView 、RecyclerViewPool 的緩存
總結(jié)
以上是生活随笔為你收集整理的Android四级缓存,RecyclerView 源码四级缓存原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单选择排序(选择排序)
- 下一篇: 业务统计报表测试点