在控制台的新Android Vitals部分中,我收到警告,超过60%的会话受到缓慢的UI渲染时间的影响(错过Vsync:1.02%,慢UI线程:14.29%,慢速绘制命令:96.84 %)。我在测试设备上打开了GPU分析(使用应用程序的生产版本),我看到以下TextView更新导致渲染时间超过16毫秒(大约24-30毫秒):
updateTimer = new Timer();
updateTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
timeLeftView.setText(timeLeftString);
}
});
}
}, 100, 500);
当我注释掉textView更新时,屏幕上没有任何内容被更改,并且探查器不会创建任何新栏。
一个线索是当使用计时器打开活动时,计时器的前3-4次更新在大约8ms时呈现,但随后它们上升到大约24-30ms。
另一个线索是当我触摸屏幕的任何部分时,渲染时间会回落到8ms左右几秒钟,然后再次拍摄到24-30ms。当我停止触摸时,渲染时间会再次回落几秒钟,然后再次拍摄。
所以我想知道的是:
答案 0 :(得分:1)
如果你在你的xml中放了很多层,它将强制android多次渲染(如果你有很多层,重构你的代码!!)。 我强烈推荐这个阅读:https://developer.android.com/training/improving-layouts/index.html
关于多次渲染TextView,渲染速度取决于您运行应用程序的设备!
答案 1 :(得分:1)
几乎每个建议都试过。
最后通过将可运行的频率从500ms增加到50ms或更短来解决它。问题是可运行的低频让CPU / GPU进入低功耗状态,因此抽取时间更长。通过增加可运行和绘制的频率,CPU / GPU不会进入低功耗状态并且帧被绘制得更快。是的,它对电池的负担更多,但并不像屏幕上的电池那么多。没有任何用户抱怨任何方式和Android生命体征现在很高兴。
此外,看看设备制造商的默认/官方应用程序是如何工作的(包括谷歌本身),这正是他们处理TextView更新的方式。例如谷歌的时钟应用程序(倒数计时器,而不是秒表)每秒更新TextView~60次,即使每秒一次也是最需要的,也是最节俭的。