Android耗電優化實踐 (二)- 檢測錯誤的UI繪製刷新導致的耗電

Android耗電優化實踐 (二)

檢測錯誤的UI繪製刷新導致的耗電

首先打開開發者選項,打開GPU視圖更新的開關,然後看看應用內部有哪些不必要的UI刷新,

場景一(自定義TextView)

首頁-快速組隊在這裏插入圖片描述

首頁快速組隊頁面,列表中查看更多在一直刷新,直接看代碼,
佈局代碼

這裏有一個自定義View,繼續看TextViewWideContent的代碼
問題代碼-onDraw()
分析代碼發現在onDraw()裏面調用了setPadding(),繼續看setPadding()的源碼,
TextView源碼
可以看到這裏面調用了頁面invalidate(),這就導致了onDraw()方法的循環調用,所以頁面會持續刷新。結論就是在自定義View的onDraw()方法裏面,調用setPadding(),會導致頁面重複繪製
解決辦法也很簡單把setPadding放到onLayout()裏面去。

場景二(CoordinatorLayout+AppBarLayout錯誤的依賴關係)

個人資料頁
錯誤代碼如下:

在這裏插入圖片描述在CoordinatorLayout+AppBarLayout頁面結構中,錯誤的將底部依賴於頭部控件,導致底部一直在刷新,去掉 app:layout_anchor="@id/user_appbar_layout" 就好了。

場景三(遊戲專區頁面視頻播放導致整體頁面刷新)

播放器導致整個頁面刷新
具體原因還在排查,可能是第三方庫導致的,要更換隻能換庫。

場景四(麥位刷新)

聊天室麥位 1
聊天室麥位2
聊天室麥位刷新導致的的頁面重繪,這邊似乎是需求如此,需要定期刷新。可能有更好的實現方式,先記錄一下。

總結一下:

  • 首先自定義View的onDraw()方法裏面,不要調onPadding(),如果一定要調用,請放在onLayout()裏面設置。
  • CoordinatorLayout+AppBarLayout 結構中,錯誤的使用app:layout_anchor="@id/user_appbar_layout" 導致整個底部刷新。

相關建議