我有一个活动来衡量布局的动画/布局/测量/等需要多长时间。
class RenderingMeasureActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.skeleton)
val view = layoutInflater.inflate(R.layout.simple, root, false)
root.postDelayed({
root.addView(view)
}, 5000)
}
}
骨架布局不过是FrameLayout
withmatch_parent
和 id root
。简单的布局就是:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="ahoj"
android:textSize="32sp" />
</FrameLayout>
在活动中,我已经推迟了addView()
,所以我确定我只是在衡量那个,没有其他影响。
现在,无论我做什么,测量结果都超出了图表。它至少需要 17 毫秒(平均更像 25 毫秒),这是 JANK(>16.7 毫秒)的明确来源。最长的持续时间是命令问题,我从FrameMetrics
gpu 分析栏和类似的持续时间也从systrace获得相同的结果。
我究竟做错了什么?是否有可能addView
(或inflate
)任何布局都非常昂贵,以至于 Android SDK 应用程序总是会出现 JANK?为什么,如果在 中设置相同的布局(合并为一个)setContentView()
,它需要更少的时间(虽然不是很多)?
PS:我尝试了其他布局,例如约束,线性,相对。合并标签有一点帮助,但并不总是可用。
PPS:以编程方式创建布局没有效果,因为我已经分离了充气部分。