當前位置:編程學習大全網 - 源碼下載 - 談談RecyclerView中的緩存

談談RecyclerView中的緩存

Android深入理解RecyclerView的緩存機制

RecyclerView在項目中的使用已經很普遍了,可以說是項目中最高頻使用的壹個控件了。除了布局靈活性、豐富的動畫,RecyclerView還有優秀的緩存機制,本文嘗試通過源碼深入了解壹下RecyclerView中的緩存機制。

RecyclerView做性能優化要說復雜也復雜,比如說布局優化,緩存,預加載等等。其優化的點很多,在這些看似獨立的點之間,其實存在壹個樞紐:Adapter。因為所有的ViewHolder的創建和內容的綁定都需要經過Adaper的兩個函數onCreateViewHolder和onBindViewHolder。

因此我們性能優化的本質就是要減少這兩個函數的調用時間和調用的次數。如果我們想對RecyclerView做性能優化,必須清楚的了解到我們的每壹步操作背後,onCreateViewHolder和onBindViewHolder調用了多少次。因此,了解RecyclerView的緩存機制是RecyclerView性能優化的基礎。

為了理解緩存的應用場景,本文首先會簡單介紹壹下RecyclerView的繪制原理,然後再分析其緩存實現原理。

RecyclerView滑動時會觸發onTouchEvent#onMove,回收及復用ViewHolder在這裏就會開始。我們知道設置RecyclerView時需要設置LayoutManager,LayoutManager負責RecyclerView的布局,包含對ItemView的獲取與復用。以LinearLayoutManager為例,當RecyclerView重新布局時會依次執行下面幾個方法:

上述的整個調用鏈:onLayoutChildren()->fill()->layoutChunk()->next()->getViewForPosition(),getViewForPosition()即是是從RecyclerView的回收機制實現類Recycler中獲取合適的View,下面主要就來從看這個Recycler#getViewForPosition()的實現。

上述邏輯用流程圖表示:

RecyclerView在Recyler裏面實現ViewHolder的緩存,Recycler裏面的實現緩存的主要包含以下5個對象:

public final class Recycler {

final ArrayList mAttachedScrap = new ArrayList<>();

ArrayList mChangedScrap = null;

RecyclerView在設計的時候講上述5個緩存對象分為了3級。每次創建ViewHolder的時候,會按照優先級依次查詢緩存創建ViewHolder。每次講ViewHolder緩存到Recycler緩存的時候,也會按照優先級依次緩存進去。三級緩存分別是:

使用自定義ViewCacheExtension後,view離屏後再回來不會走onBindViewHolder()方法。

holder.setIsRecyclable(false),這樣的話每次都會走onCreateViewHolder()和onBindViewHolder()方法

1.提前初始化viewHolder,放到緩存池中

viewPool.putRecycledView(adapter.onCreateViewHolder(recyclerView, 1))

2.提前初始化view,在onCreateViewHolder的時候去取view

3.自定義ViewCacheExtension

4.適當的增加cacheSize

4.公用緩存池,比如多個viewPager+fragment場景使用,或者全局單利緩存池,感覺用戶不大。

有2中做法有值

第壹種

第二種

不會,因為prefetch(GapWorker中的壹個方法)之後mViewCacheMax會變成mRequestedCacheMax + extraCache

有2種方式可以讓緩存失效

第壹種

recyclerView.setItemViewCacheSize(-1)

第二種

recyclerView.setItemViewCacheSize(0)

layoutManager.isItemPrefetchEnabled = false

設置不緩存後,來回滑動讓view進入屏幕離開屏幕,viewHolder的item時會多次走onBindViewHolder()方法。

  • 上一篇:中美誰是金牌第壹懸念將揭曉(東京奧運會獎牌榜競爭白熱化)
  • 下一篇:挑戰者600(突破極限,征服速度)
  • copyright 2024編程學習大全網