阿里3輪面試都問了RecyclerView
阿里面試總共4輪,其中有3輪面試都問到了RecyclerView的問題。面試的點各不相同,有原理、巢狀問題、有快取實現,但是最終都是殊途同歸,所有的問題都彙集在,如何對RecyclerView做效能最佳化?
1.1 RecyclerView第一次layout時,會發生預佈局pre-layout嗎?
第一次佈局時,並不會觸發pre-layout。pre-layout只會在每次notify change時才會被觸發,目的是透過saveOldPosition方法將螢幕中各位置上的ViewHolder的座標記錄下來,並在重新佈局之後, 透過對比實現Item的動畫效果。比如以下效果:
1.2 如果自定義LayoutManager需要注意什麼?
在RecyclerView的dispatchLayoutStep1階段,會呼叫自定義LayoutManager的 supportsPredictiveItemAnimations 方法判斷在某些狀態下是否展示predictive animation。以下LinearLayoutManager的實現:
如果 supportsPredictiveItemAnimations 返回true,則LayoutManager中複寫onLayoutChildren方法會被呼叫2次:一次是在pre-layout,另一次是real-layout。
因為會有pre-layout和real-layout,所有在自定義LayoutManager中,需要根據RecyclerView.State中的isPreLayout方法的返回值,在這兩次佈局中做區分。比如LinearLayoutManager中的onLayoutChildren中有如下判斷:
上面程式碼中有一段註釋:
if the child is visible and we are going to move it around, we should layout extra items in the opposite direction to make sure new items animate nicely instead of just fading in
代表的意思就是如果當前正在update的item是可見狀態,則需要在pre-layout階段 額外填充一個item,目的是為了保證處於不可見狀態的item可以平滑的滑動到螢幕內。
1.3 舉例說明
比如下圖中點選item2將其刪除,呼叫notifyItemRemoved後,在pre-layout之前item5並沒有被新增到RecyclerView中,而經過pre-layout之後,item5經過佈局會被填充到RecyclerView中
當item移出螢幕之後,item5會隨同item3和item4一起向上移動,如下圖所示:
如果自定義LayoutManager並沒有實現pre-layout,或者實現不合理,則當item2移出螢幕時,只會將item3和item4進行平滑移動,而item5只是單純的appear到螢幕中,如下所示:
可以看出item5並沒有同item3和item4一起平滑滾動到螢幕內,這樣介面上顯示會給使用者卡頓的感覺。
1.4 ViewHolder何時被快取到RecycledViewPool中?
主要有以下2種情況:
- 當ItemView被滑動出螢幕時,並且CachedView已滿,則ViewHolder會被快取到RecycledViewPool中
- 當資料發生變動時,執行完disappearrance的ViewHolder會被快取到RecycledViewPool中
1.5 CachedView和RecycledViewPool的關係
當一個ItemView被滑動滾出螢幕之後,預設會先被儲存在CachedView中。CachedView的預設大小為2,可以透過 setItemViewCacheSize 方法修改它的值。當CachedView已滿後,後續有新的ItemView從螢幕內滑出時,會迫使CachedView根據FIFO規則,將之前的快取的ViewHolder轉移到RecycledViewPool中,效果可以參考下圖:
RecycledViewPool預設大小為5,可以透過以下方式修改RecycledViewPool的快取大小:
1.6 CachedView和RecycledViewPool兩者區別
快取到CachedView中的ViewHolder並不會清理相關資訊(比如position、state等),因此剛移出螢幕的ViewHolder,再次被移回螢幕時,只要從CachedView中查詢並顯示即可,不需要重新繫結(bindViewHolder)。
而快取到RecycledViewPool中的ViewHolder會被清理狀態和位置資訊,因此從RecycledViewPool查詢到ViewHolder,需要重新呼叫bindViewHolder繫結資料。
1.7 你是從哪些方面最佳化RecyclerView的?
我總結了幾點,主要可以從以下幾個方面對RecyclerView進行最佳化:
儘量將複雜的資料處理操作放到非同步中完成。RecyclerView需要展示的資料經常是從遠端伺服器上請求獲取,但是在網路請求拿到資料之後,需要將資料做扁平化操作,儘量將最優質的資料格式返回給UI執行緒。
最佳化RecyclerView的佈局,避免將其與ConstraintLayout使用
針對快速滑動事件,可以使用addOnScrollListener新增對快速滑動的監聽,當使用者快速滑動時,停止載入資料操作。
如果ItemView的高度固定,可以使用setHasFixSize(true)。這樣RecyclerView在onMeasure階段可以直接計算出高度,不需要多次計運算元ItemView的高度,這種情況對於垂直RecyclerView中巢狀橫向RecyclerView效果非常顯著。
當UI是Tab feed流時,可以考慮使用RecycledViewPool來實現多個RecyclerView的快取共享。
另外,我分享一份從網路上收錄整理的 Android學習PDF+架構影片+面試文件等,還有 Android開發面試專題資料,高階進階架構資料供大家學習進階
如果你現在有需要的話,可以在 點選檢視《 Android開發核心知識點筆記》 最新版獲取哦,路過別忘了點個Star
喜歡本文的話,不妨給我點個小贊、評論區留言或者轉發支援一下唄~
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946034/viewspace-2723650/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 阿里的面試官都喜歡問哪些問題?阿里面試
- 阿里的面試官都喜歡問哪些技術問題?阿里面試
- 月薪5w!參加阿里Python面試,共4輪,被問了這些~收藏!阿里Python面試
- 面試現場:這些常問的面試題你都會了嗎面試題
- 3道常見的vue面試題,你都會了嗎?Vue面試題
- 三年Java程式設計師,被無良HR欺騙,3輪面試都過了,最後慘被放鴿子Java程式設計師面試
- 阿里五面都過了,結果被刷了,問了hr原因竟說是...阿里
- 面試了 6 輪 Google 中國 之後,還是掛了面試Go
- 面試 HTTP ,99% 的面試官都愛問這些問題面試HTTP
- 面試官:你都工作3年了,這個演算法題都不會?面試演算法
- 接到阿里的面試電話了阿里面試
- 用RecyclerView打造一個輪播圖View
- 面試現場!月薪3w+的這些資料探勘SQL面試題你都掌握了嗎?SQL面試題
- 2019年Spring Boot面試都問了什麼?快看看這22道面試題!Spring Boot面試題
- 漲知識!阿里P8面試官都說太詳細了,年薪超過80萬!阿里面試
- 如何使用RecyclerView打造首頁輪播圖View
- 科技大亨面試時都愛問什麼樣的面試問題?面試
- 面試前:各方面都匹配 面試後:恐怕是涼了面試
- 利用RecyclerView實現無限輪播廣告條View
- 阿里面試官都愛問的記憶體管理和GC演算法及回收策略阿里面試記憶體GC演算法
- 【面試篇】金九銀十面試季,這些面試題你都會了嗎?面試題
- 大廠面經:三非背景、6輪面試,終獲阿里Offer!面試阿里
- 面試:為了進阿里,重新翻閱了Volatile與Synchronized面試阿里synchronized
- 阿里Jvm必問面試題及答案阿里JVM面試題
- 阿里面試Redis常考問題阿里面試Redis
- 你們的軟體工程師面試都弱爆了軟體工程工程師面試
- MySQL MVCC 原理硬核解析,阿里面試官看了都直呼內行MySqlMVC阿里面試
- 用RecyclerView打造一個輪播圖(進階版)View
- Java面試必問面試題,你掌握了嗎?Java面試題
- 阿里JAVA開發面試常問問題總結阿里Java面試
- 所有的PHP面試題,職場問題都整理在這裡了,來年(2021年)面試的時候有用PHP面試題
- BATJ都愛問的多執行緒面試題BAT執行緒面試題
- 分享30道Redis面試題,面試官能問到的我都找到了Redis面試題
- RecyclerView問題彙總View
- HTTP/3 都來了,你卻還在用 HTTP/1.1?HTTP
- 4.21 阿里電話面試問題記錄阿里面試
- 阿里資深專家面試問題收集阿里面試
- RecyclerView 知識梳理(3) LayoutManagerView