Что делает postInvalidate()?

Какая польза от функции postInvalidate() в Android? Я видел эту функцию во многих местах. Когда я погуглил, я выдал следующее:

postInvalidate -- опубликовать запрос на аннулирование в потоке пользовательского интерфейса

Я не знаю, что там означает фраза "недействительный запрос". Кто-нибудь может подробно объяснить, что здесь происходит?


person rogerstone    schedule 02.04.2011    source источник


Ответы (3)


Каждый класс, производный от класса View, имеет методы invalidate и postInvalidate. Если вызывается invalidate, он сообщает системе, что текущий вид изменился и его следует перерисовать как можно скорее. Поскольку этот метод можно вызывать только из вашего UIThread, необходим другой метод, когда вы не находитесь в UIThread и все еще хотите уведомить систему об изменении вашего представления. Метод postInvalidate уведомляет систему о не-UIThread, и представление перерисовывается в следующем цикле событий в UIThread как можно скорее. Это также кратко объясняется в документации SDK.

Просто сравните invalidate и postInvalidate.

person MarioB.    schedule 02.04.2011
comment
Спасибо за ответ. Теперь понял. - person rogerstone; 02.04.2011
comment
Я вижу логику в вашем ответе, но invalidate() также работает в моем классе без пользовательского интерфейса. Работает так же хорошо, как postInvalidate(). - person Sebastian; 13.08.2012
comment
Отличный ответ. Документы Android не объясняют, что он предназначен для перерисовки представления. Сразу разобрался :) - person Andy; 10.11.2012
comment
Как упомянул @Sebastian, я также пробовал invalidate() и postInvalidate() из потока без пользовательского интерфейса (используя Executors.newSingleThreadExecutor()), но оба они работают нормально, по крайней мере, проблем не возникает. Кто-нибудь знает, почему? - person starriet; 25.12.2020

С помощью этого метода (postInvalidate()) вы можете аннулировать View из потоков, не связанных с пользовательским интерфейсом. Чтобы аннулировать View из потока пользовательского интерфейса, используйте метод invalidate().

Аннулирование означает, что метод View.onDraw(Canvas) будет вызван в какой-то момент в будущем (не сразу) для перерисовки всего View (если View виден).

Android перерисовывает Views автоматически, но иногда необходимо сказать: "Эй, этот View был изменен, перерисуйте его как можно быстрее".

Подробнее на:

http://developer.android.com/guide/topics/ui/how-android-draws.html

http://developer.android.com/reference/android/view/View.html#invalidate%28%29

person branoholy    schedule 02.04.2011

Проще говоря, метод invalidate() можно вызвать из потока пользовательского интерфейса, а метод postInvalidate() можно вызвать из потока, отличного от пользовательского интерфейса, чтобы указать Android обновить наш пользовательский вид после внесения в него некоторых изменений.

person Rahul Yadav    schedule 21.07.2016