If you add the call to serviceRepaints(), then I would change this:
to use a constant slightly bigger than 0. Otherwise, if the painting takes too long you'll end up constantly repainting the screen and not leave any time for handling key events.
Thread.sleep(Math.max(0, tm - System.currentTimeMillis()));
It's looks OK to me. There are other options which are also OK. Different techniques (like synchronizing the painting using callSerially()) might work slightly better or worse on different phones. There is no "perfect" way. Nothing beats doing tests on real devices.