2020年3月15日 星期日

[Android] RecyclerView 頻繁刷新效能最佳化

有頻繁刷新 RecyclerView 的需求時,有時候會產生一些性能問題,那 RecyclerView 最佳化的方向有幾個,大概整理如下,供以後需要時備查。

DiffUtil

DiffUtil 是 Google 開發出來跟 RecyclerView 搭配使用的一個工具類,用途是計算出新舊 list item 中有差異的項目,以求最小化更新 list 節省 CPU 時間。

使用方法非常簡單,只需要實做 DiffUtil.Callback 介面,剩下找出 list 差異項目的工作就交給 DiffUtil 實現,套用這個最佳化方法 effort 很小。

但是要注意的是,若是 list 很大而且內部資料幾乎每次全部都會變動的話則不適合使用 DiffUtil,反而會造成耗時增加,還是要看一下實際場景,再決定要不要使用。

StaticLayout

若是 list 中有 TextView 的話,可以看一下是不是花了很多時間在 setText method 上,因為在套用 DynamicLayout 的時候 setText 是很耗時的,此時可以參考 Instagram 的最佳化 TextView 文章,使用 StaticLayout 來節省 CPU 時間。

這個最佳化方法比較複雜,所以在決定套用前,要先確定 setText 是不是效能瓶頸,TextView 也有可能自己就選擇使用 BoringLayout 或 StaticLayout,要看實際場景以及 TextView 內部演算法決定。

View Pool

RecyclerView 預設 View Pool 的數量是 5,也就是超過 5 個 list item 之後,使用 notifyDataSetChanged 更新 list 會常常呼叫到 onCreateViewHolder,因為 inflate view 也算是有點耗時的操作,所以可以視需求決定要不要增加 view pool 容量,以減少 onCreateViewHolder 呼叫。


沒有留言:

張貼留言