日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2023/12/13 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 源码四级缓存原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。