App 性能優化 RecyclerView 1、onBindViewHolder 運行在 UI 線程,不宜進行邏輯等耗時操作,只適合把數據填入視圖; 2、使用 support 包下麵的 DiffUtil 局部刷新處理,DiffUtil(內部也是調用局部刷新方法)可以對比數據的差異,是否更改; Dif ...
App 性能優化
RecyclerView
1、onBindViewHolder 運行在 UI 線程,不宜進行邏輯等耗時操作,只適合把數據填入視圖;
2、使用 support 包下麵的 DiffUtil 局部刷新處理,DiffUtil(內部也是調用局部刷新方法)可以對比數據的差異,是否更改;
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffCallBack(oldDatas, newDatas), true); diffResult.dispatchUpdatesTo(mAdapter);
計算在主線程,如果數據量大需要放線上程中,通過 Handler 更新。
3、給可以復用 holder 的 RecyclerView 設置相同的 holder pool,在相同視圖中,不會重新創建 holder;
RecyclerView recyclerView = new RecyclerView(context); //layoutManager.setRecycleChildrenOnDetach(true);//LinearLayoutManager 需要額外設置 recyclerView.setRecycledViewPool(mPool);
4、數據緩存,直接載入網路數據延遲比較重,載入緩存中的數據;
5、優化代碼,儘量減少對象的創建,復用對象資源,比如監聽;
6、getExtraLayoutSpace 預載入,RecyclerView 只緩存可見 view,滑動時初次載入會導致延遲卡頓,可以使用預載入處理,改變載入的滑動範圍;
7、嵌套 RecyclerView 時,通過 setInitialPrefetchItemCount 設置首次顯示個數,只有在嵌套且橫向列表才生效;
黑白屏
系統載入 app 時,會先顯示一個空白頁,空白頁背景色從應用主題中獲取,一般預設是白色。
1、通過給啟動頁單獨設置主題背景或顏色來避免,否則每個活動都會設置成一樣的啟動圖片。
設置背景顏色透明,如果啟動的活動耗時長,會導致啟動卡頓,需要避免啟動活動的耗時操作;
設置背景圖片,需要引入多張圖片來做屏幕適配,而且無法適配所有屏幕,所以一般使用 LayerDrawable,然後引入資源圖片,通過設置偏移量等參數達到適配效果。
2、減少 Application 耗時任務。
把一些非必要的第三方等操作單獨初始化,比如 IntentService。
app 啟動頁優化
apk 體積優化
佈局優化
1、減少層次嵌套;
2、減少重覆繪製,可以通過系統設置中打開 Show GPU Overdraw 設置查看,紅色表示需要優化;
3、使用 include(復用佈局)、merge(減少嵌套)、ViewStub(按需求載入,只能執行一次)。
包體積優化
1、使用 tint 避免多次導入資源;
2、資源配置,ndk、resConfigs、代碼混淆等;
3、刪除無引用資源。
ANR 處理
發生 ANR 時, 系統會在 /data/anr/ 目錄下生成一個 traces.txt 文件,可以通過 adb 命令將其導出到本地查看,一般的 ANR 都能定位到具體類。
1、iowait
日誌中顯示 CPU 占用情況,其中 io 占用大部分,表示有頻繁的讀寫(資料庫、文件)操作;
2、dalvik threads free
顯示記憶體不夠,一般會觸發 oom 異常。
網路優化
1、減少調用次數跟發送和接收數據包的大小,Android Studio 內置 Monitor 工具,可以查看接收和發送速度;
2、網路緩存;
3、七牛資源圖片等載入適合的資源,比如壓縮圖。