08 性能优化-耗电优化-绘制耗电
2021-04-13 本文已影响0人
凤邪摩羯
检测错误的UI绘制刷新导致的耗电
-
排除由于错误的绘制方法,导致CPU占用过高,进而导致耗电量高
-
检测方式参考大众点评App的短视频耗电量优化实战
首先打开开发者选项,打开GPU视图更新的开关,然后看看应用内部有哪些不必要的UI刷新,
场景一(自定义TextView)
![](https://img.haomeiwen.com/i3012236/1f802410188813cd.gif)
![](https://img.haomeiwen.com/i3012236/e859aec1583c9986.gif)
首页快速组队页面,列表中查看更多在一直刷新,直接看代码,
![](https://img.haomeiwen.com/i3012236/f271c26dc65db02f.png)
这里有一个自定义View,继续看TextViewWideContent的代码
![](https://img.haomeiwen.com/i3012236/92acfa21a54eea63.png)
分析代码发现在onDraw()里面调用了setPadding(),继续看setPadding()的源码,
![](https://img.haomeiwen.com/i3012236/13266a4ce301a2b8.png)
可以看到这里面调用了页面invalidate(),这就导致了onDraw()方法的循环调用,所以页面会持续刷新。结论就是在自定义View的onDraw()方法里面,调用setPadding(),会导致页面重复绘制
解决办法也很简单把setPadding放到onLayout()里面去。
场景二(CoordinatorLayout+AppBarLayout错误的依赖关系)
![](https://img.haomeiwen.com/i3012236/07f9b98372742373.gif)
错误代码如下:
![](https://img.haomeiwen.com/i3012236/9f8b6750cc5e4998.png)
在CoordinatorLayout+AppBarLayout页面结构中,错误的将底部依赖于头部控件,导致底部一直在刷新,去掉 app:layout_anchor="@id/user_appbar_layout" 就好了。
场景三(游戏专区页面视频播放导致整体页面刷新)
![](https://img.haomeiwen.com/i3012236/c09663234fb8b24b.gif)
具体原因还在排查,可能是第三方库导致的,要更换只能换库。
场景四(麦位刷新)
![](https://img.haomeiwen.com/i3012236/beeaf1dde4e0aa0f.gif)
![](https://img.haomeiwen.com/i3012236/b23c9ff36f070353.gif)
聊天室麦位刷新导致的的页面重绘,这边似乎是需求如此,需要定期刷新。可能有更好的实现方式,先记录一下。
总结一下:
- 首先自定义View的onDraw()方法里面,不要调onPadding(),如果一定要调用,请放在onLayout()里面设置。
- CoordinatorLayout+AppBarLayout 结构中,错误的使用app:layout_anchor="@id/user_appbar_layout" 导致整个底部刷新。