Что будет если вызвать 10 раз метод View.invalidate или View.requestLayout
Методы View.invalidate()
и View.requestLayout()
в Android используются для обновления и перерисовки пользовательского интерфейса.
View.invalidate()
Метод invalidate()
сообщает системе, что область представления (View
) нуждается в перерисовке. Это приводит к тому, что метод onDraw()
будет вызван в следующем цикле отрисовки.
invalidate()
не перерисовывает вид немедленно, а помечает его как "необходимую перерисовку". Реальная перерисовка произойдет при следующем цикле отрисовки.invalidate()
несколько раз подряд, система все равно выполнит только одну перерисовку для виджета. Многократные вызовы invalidate()
на тот же вид не приводят к множественной перерисовке, так как запросы объединяются и выполняются вместе.View.requestLayout()
Метод requestLayout()
сообщает системе, что размер и/или расположение представления могут измениться, и поэтому нужно запросить перерасчет макета. Это приводит к тому, что метод onMeasure()
и onLayout()
будут вызваны для пересчета размеров и расположения виджетов.
requestLayout()
не вызывает перерасчет макета немедленно, а помечает вид как требующий перерасчета. Фактический перерасчет и повторное размещение произойдут при следующем проходе макета.requestLayout()
на тот же вид приводят к выполнению только одного перерасчета макета. Система объединяет запросы и выполняет перерасчет только один раз.Если вы вызываете invalidate()
и requestLayout()
по 10 раз на одном и том же виде, их поведение будет следующим:
invalidate()
: Все вызовы invalidate()
будут объединены в один запрос на перерисовку. Вид будет перерисован один раз при следующем цикле отрисовки, независимо от количества вызовов.
requestLayout()
: Все вызовы requestLayout()
будут объединены в один запрос на перерасчет макета. Вид будет перерасчитан и перестроен один раз при следующем проходе макета, независимо от количества вызовов.