Ответ
Вызов invalidate() помечает View как недействительную, запрашивая перерисовку в следующем цикле отрисовки UI. Система объединит несколько вызовов invalidate() в один проход для оптимизации.
Если нужно немедленное обновление (например, при анимации), используйте postInvalidate(), который работает из не-UI потоков.
Пример:
view.invalidate() // Запрос на перерисовку
// Или из фонового потока:
view.postInvalidate()
Важно: invalidate() не вызывает onDraw() напрямую, а лишь планирует его выполнение.