Существует несколько способов вызвать перерисовку (invalidate) кастомного View:
invalidate():
onDraw().kotlin
invalidate(Rect dirty) или invalidate(int left, int top, int right, int bottom):
kotlin
postInvalidate():
invalidate() в очередь сообщений для выполнения на UI-потоке.kotlin
Сравнение invalidate() и postInvalidate():
| Метод | Поток выполнения | Безопасность из фонового потока | Назначение |
|---|---|---|---|
invalidate() | UI-поток | Нет | Немедленная перерисовка (насколько это возможно в UI-потоке) |
postInvalidate() | UI-поток | Да | Отложенная перерисовка путем постановки в очередь сообщений |
Связь с onDraw():
Вызов любого из методов invalidate(...) планирует выполнение метода onDraw() вашего View. Cистема Android объединяет несколько запросов на invalidate в один, если это возможно, для оптимизации производительности. onDraw() вызывается только тогда, когда система готова к перерисовке.
Когда использовать каждый метод:
invalidate(), когда вы находитесь в UI-потоке (например, в обработчике клика, после анимации) и изменения затрагивают весь View или вам не важна оптимизация по области.invalidate(Rect) или invalidate(int, int, int, int) для оптимизации, если изменения затрагивают только часть View, и вы находитесь в UI-потоке.postInvalidate(), когда вам нужно вызвать invalidate из фонового потока.invalidate() или postInvalidate() слишком часто без необходимости, так как это может негативно сказаться на производительности. Вызывайте их только после изменения данных или состояния View, которые требуют визуального обновления.