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