Вы можете попробовать использовать TimerTask , запланированный для с фиксированной скоростью выполнение на Таймер .
Timer и TimerTask являются частью Android SDK (и Java SE). Выполнения не задерживаются из-за времени выполнения предыдущего события.
Timer timer = new Timer("MetronomeTimer", true);
TimerTask tone = new TimerTask(){
@Override
public void run(){
//Play sound
}
};
timer.scheduleAtFixedRate(tone, 500, 500); //120 BPM. Executes every 500 ms.
Затем вы можете отменить TimerTask, когда вам нужно изменить BPM.
tone.cancel();
tone = new TimerTask(){...}
timer.scheduleAtFixedRate(tone, 1000, 1000); //60 BPM. Executes every 1000 ms.
Еще одна возможность, которая может удовлетворить ваши требования (из ваших комментариев), - это вращать поток и проверять System.nanoTime () и спать с шагом, но вращаться, когда вы приближаетесь к пробуждению.
long delayNanos = 500000000;
long wakeup = System.nanoTime() + delayNanos; //Half second from right now
long now;
while(!done){
now = System.nanoTime();
//If we are less than 50 milliseconds from wake up. Spin away.
if(now <= wakeup - 50000000){
//Sleep in very small increments, so we don't spin unrestricted.
Thread.sleep(10);
}
if(now >= wakeup){
//Play sound
wakeup += delayNanos;
}
}