如何使addView()更便宜

时间:2019-04-28 10:31:51

标签: android performance layout-inflater jank

我有一项活动可以测量布局的动画/布局/度量/等时间。

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,其中match_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()中设置了相同的布局(合并为一个),则花费的时间更少(虽然不是很多)?

P.S .:我尝试了其他布局,例如约束,线性,相对。合并标签有助于一点,但并不总是可用。
P.P.S .:以编程方式创建布局没有效果,因为我将膨胀部分分开了。

0 个答案:

没有答案