Выполняет ли проводка 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()
отправляет задачу в основной поток, который будет выполнен позже. Эта задача выполнит измерение и макет в иерархии представлений. Теперь, если вы разместите еще одну задачу, она будет помещена в очередь после задания макета и, как результат, всегда будет выполняться после того, как произойдет измерение и макет. Таким образом, вы всегда будете иметь допустимые размеры.