阿里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的實現:
@Override
public boolean supportsPredictiveItemAnimations() {
return mPendingSavedState == null && mLastStackFromEnd == mStackFromEnd;
}
如果 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的快取大小:
RecyclerView.getRecycledViewPool().setMaxRecycledViews(int viewType, int max);
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進階架構
連結:https://www.jianshu.com/p/eabb00c500ef
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
相關文章
- 阿里的面試官都喜歡問哪些問題?阿里面試
- 阿里的面試官都喜歡問哪些技術問題?阿里面試
- 月薪5w!參加阿里Python面試,共4輪,被問了這些~收藏!阿里Python面試
- 面試現場:這些常問的面試題你都會了嗎面試題
- 阿里五面都過了,結果被刷了,問了hr原因竟說是...阿里
- 2019年Spring Boot面試都問了什麼?快看看這22道面試題!Spring Boot面試題
- 3道常見的vue面試題,你都會了嗎?Vue面試題
- 面試 HTTP ,99% 的面試官都愛問這些問題面試HTTP
- ?來瞧瞧阿里一面都面些什麼(筆試+機試)阿里筆試
- 大廠面經:三非背景、6輪面試,終獲阿里Offer!面試阿里
- 面試現場!月薪3w+的這些資料探勘SQL面試題你都掌握了嗎?SQL面試題
- 面試前:各方面都匹配 面試後:恐怕是涼了面試
- 面試官:你都工作3年了,這個演算法題都不會?面試演算法
- 面試了 6 輪 Google 中國 之後,還是掛了面試Go
- 三年Java程式設計師,被無良HR欺騙,3輪面試都過了,最後慘被放鴿子Java程式設計師面試
- 面經手冊 · 開篇《面試官都問我啥》面試
- 【面試篇】金九銀十面試季,這些面試題你都會了嗎?面試題
- Java面試必問面試題,你掌握了嗎?Java面試題
- 阿里Jvm必問面試題及答案阿里JVM面試題
- 面試:為了進阿里,重新翻閱了Volatile與Synchronized面試阿里synchronized
- 漲知識!阿里P8面試官都說太詳細了,年薪超過80萬!阿里面試
- 分享30道Redis面試題,面試官能問到的我都找到了Redis面試題
- 面試別再問我String了面試
- 所有的PHP面試題,職場問題都整理在這裡了,來年(2021年)面試的時候有用PHP面試題
- 阿里資深專家面試問題收集阿里面試
- 4.21 阿里電話面試問題記錄阿里面試
- BATJ都愛問的多執行緒面試題BAT執行緒面試題
- 都9012年了,怎麼還會有人不會面試?面試
- 【面試】-阿里前端社招面試面試阿里前端
- 阿里巴巴7輪面經-已offer阿里
- 每次面試都會被問,什麼是紅黑樹?面試
- 40個Java集合面試問題和答案,面試奇葩問題,你掌握了嗎?Java面試
- 邦芒面試:這10個問題都答不上來,你還想透過面試?面試
- Bigo的Java面試,我掛在了第三輪技術面上.........GoJava面試
- 炸了!3年圖片都沒了
- 面試官,請別再問我 3 次握手與 4 次揮手了!面試
- 拜託,面試別再問我JVM了!!!面試JVM
- 拜託,面試別再問我TopK了!!!面試TopK