Выполняет ли проводка Runnable в потоке пользовательского интерфейса, чтобы макет был закончен, когда он запущен?

Первое! я do знать о ViewTreeObserver.onGlobalLayoutListener.

Что заставило меня задаться этим вопросом, так это следующее уведомление на веб-сайте документации разработчика Android:

Ниже приведен фрагмент ниже:

  • Получает родительское представление и отправляет Runnable в поток пользовательского интерфейса. Это гарантирует, что родитель выдает свои дочерние элементы перед вызовом Метод getHitRect(). Метод getHitRect() получает дочерний удар прямоугольник (осязаемая область) в родительских координатах.

Сам фрагмент:

parentView.post(new Runnable() {
            // Post in the parent message queue to make sure the parent
            // lays out its children before you call getHitRect()
            @Override
            public void run() {
               /// do UI stuff
            }
});

(вы можете посмотреть полную статью)

Так это неправильное утверждение или это правда? Я прошу, потому что публикация runnable кажется проще и удобнее по сравнению с тем, что делает танец register-listenener/handle-event/unregister-listener с ViewTreeObserver:)

ОБНОВЛЕНИЕ: Еще один вопрос, чтобы придать ясность всему предмету: Если все это хорошо, а Runnable может быть размещен вместо использования глобального приемника раскладки, то почему у нас есть этот механизм ViewTreeObserver.onGlobalLayoutListener вообще? Когда лучше использовать его, а не размещать Runnable и какая разница между этими методами?

Ответ 1

Мне тоже нравится вопрос. Это заставило меня снова заглянуть в исходный код Android. Я считаю, что это работает, потому что post() вызывается после setContentView().

Метод setContentView() заканчивается при вызове ViewGroup.addView() верхнего вида, а вызов addView() всегда вызывает requestLayout(). В свою очередь, requestLayout() отправляет задачу в основной поток, который будет выполнен позже. Эта задача выполнит измерение и макет в иерархии представлений. Теперь, если вы разместите еще одну задачу, она будет помещена в очередь после задания макета и, как результат, всегда будет выполняться после того, как произойдет измерение и макет. Таким образом, вы всегда будете иметь допустимые размеры.