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)
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);
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 的緩存
總結
以上是生活随笔為你收集整理的Android四级缓存,RecyclerView 源码四级缓存原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单选择排序(选择排序)
- 下一篇: android sina oauth2.