it seems the only good results I get are with a while loop, which loops doing nothing until its time to work.
any time I try using sleep it over sleeps, even when I use Thread.sleep(1);
EDIT: its worth noting it doesn't oversleep a little, it oversleeps a whole other game loops worth
Are you testing in the emulator on Windows or on a real Android device ?
Android can run apps with realtime scheduling and shouldn't oversleep by much while Windows (aswell as Mac and Desktop Linux) will oversleep constantly. (Are you using a SurfaceView or something else for the rendering ?)
The main thing to take care of with Android is to make sure the garbage collector doesn't run at the wrong time (if you got garbage to clean up it will try to do so when you sleep), holding on to your references until you hit for example the end of a level and then drop them and force a garbage collection is a very good idea.