Android效能優化——列表類控制元件卡頓優化
原文連結:列表類控制元件卡頓優化
1、使用ConstraintLayout減少佈局層級。
2、可以的話,設定RecyclerView佈局等高,然後設定recyclerView.setHasFixedSize(true)這樣可以避免每次繪製Item時,不再重新計算Item高度。
3、根據需求修改RecyclerView預設的繪製快取選項
recyclerView.setItemViewCacheSize(20);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
4、在onBindViewHolder/getView方法中,減少邏輯判斷,減少臨時物件建立。例如:複用事件監聽,在其方法外部建立監聽,可以避免生成大量的臨時變數。
減少邏輯判斷參考方案:
//優化前:
class MyRecyclerView.Adapter extends RecyclerView.Adapter {
static final TODAYS_DATE = new Date();
static final DATE_FORMAT = new SimpleDateFormat("MM dd, yyyy");
public onBindViewHolder(Task.ViewHolder tvh, int position) {
Task task = getItem(position);
if (TODAYS_DATE.compareTo(task.dateDue) > 0) {
tvh.backgroundView.setColor(Color.GREEN);
} else {
tvh.backgroundView.setColor(Color.RED);
}
String dueDateFormatted = DATE_FORMAT.format(task.getDateDue());
tvh.dateTextView.setDate(dueDateFormatted);
}
}
//優化後,改寫model
public class TaskViewModel {
int overdueColor;
String dateDue;
}
public onBindViewHolder(Task.ViewHolder tvh, int position) {
TaskViewModel taskViewModel = getItem(position);
tvh.backgroundView.setColor(taskViewModel.getOverdueColor());
tvh.dateTextView.setDate(taskViewModel.getDateDue());
}
6、避免整個列表的資料更新,只更新受影響的佈局。例如,載入更多時,不使用notifyDataSetChanged()
,而是使用notifyItemRangeInserted(rangeStart, rangeEnd)
7、scrollingCache=false animationCache=false
(針對ListView)
scrollingCache: scrollingCache
本質上是drawing cache,你可以讓一個View將他自己的drawing儲存在cache中(儲存為一個bitmap),這樣下次再顯示View的時候就不用重畫了,而是從cache中取出。預設情況下drawing cahce是禁用的,因為它太耗記憶體了,但是它確實比重畫來的更加平滑。而在ListView中,scrollingCache是預設開啟的,我們可以手動將它關閉。
animateCache: ListView預設開啟了animateCache,這會消耗大量的記憶體,因此會頻繁呼叫GC,我們可以手動將它關閉掉。
8、對於RecyclerView,持有item具有的獨特id,可以很容易地確定具體item並單獨更新,當變化發生時,可以按照如下方式更新,從而避免整體重新整理:
adapter.setHasStableIds(true);
adapter.notifyItemRemoved(position);
adapter.notifyItemChanged(position);
adapter.notifyItemInserted(position);
參考:
https://stackoverflow.com/questions/27188536/recyclerview-scrolling-performance
https://stackoverflow.com/questions/27993627/optimizing-recyclerview-listview
另外附上一個大神寫的Adapter優化:http://www.jianshu.com/p/411ab861034f 其實現有用到以上部分思路。
相關文章
- Android效能優化----卡頓優化Android優化
- 六、Android效能優化之UI卡頓分析之渲染效能優化Android優化UI
- 優化動畫卡頓:卡頓原因分析及優化方案優化動畫
- Android卡頓優化學習筆記Android優化筆記
- Android 效能優化 ---- 啟動優化Android優化
- Android效能優化Android優化
- Flutter卡頓優化錦輯Flutter優化
- Android效能優化——圖片優化(二)Android優化
- Android效能優化之佈局優化Android優化
- Android效能優化(1)—webview優化篇Android優化WebView
- Android效能優——佈局優化Android優化
- Android效能優化——效能優化的難題總結Android優化
- Android效能優化(Memory)Android優化
- Android 效能優化之記憶體優化Android優化記憶體
- Android效能優化篇之服務優化Android優化
- iOS效能優化系列篇之“列表流暢度優化”iOS優化
- Android效能優化筆記(一)——啟動優化Android優化筆記
- 頁面卡頓的優化–圓角優化
- Android效能優化 筆記Android優化筆記
- Android 效能優化(十二)之我為什麼寫效能優化Android優化
- 效能優化的主要內容列表優化
- Android效能優化(4):UI渲染機制以及優化Android優化UI
- iOS應用千萬級架構:效能優化與卡頓監控iOS架構優化
- 【前端效能優化】vue效能優化前端優化Vue
- 小程式Android端movable-view拖拽卡頓掉幀的優化AndroidView優化
- Android效能優化全方面解析Android優化
- 前端效能優化(JS/CSS優化,SEO優化)前端優化JSCSS
- 讀書筆記3-卡頓優化篇筆記優化
- Android效能UI卡頓AndroidUI
- Android 把效能優化落到實處Android優化
- [效能優化]DateFormatter深度優化探索優化ORM
- 前端效能優化 --- 圖片優化前端優化
- 效能優化|Tomcat 服務優化優化Tomcat
- Android深度效能優化--記憶體優化(一篇就夠)Android優化記憶體
- 效能優化優化
- 婚戀app原始碼開發,相親直播間聊天訊息列表卡頓優化APP原始碼優化
- WPF 效能最佳化-列表控制元件效能控制元件
- iOS開發——專案實戰總結&UITableView效能優化與卡頓問題iOSUIView優化