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

0 ответов

Другие вопросы по тегам