Как сделать addView() дешевле
У меня есть действие, которое измеряет, сколько времени занимает анимация / разметка / мера / и т.д. разметки.
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
и идентификатор 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: Создание макета программно не имеет никакого эффекта, так как я разделил надувную часть.