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