1)
Is this what postInvalidate() is for?
Yes
Use this to invalidate the View from a non-UI thread.
invalidate()
is for updating Views
on the UI Thread
2)
How guaranteed am I that the invalidation and update will happen soon (if the UI thread isn't busy)?
Also from that same part of the docs
Cause an invalidate to happen on a subsequent cycle through the event loop
So I guess this depends on your definition of "soon". As the docs say it should happen on the next event loop