Я пытаюсь создать приложение для моей игры на гитаре, в котором одновременно выполняются две вещи - метроном и таймер обратного отсчета.Им обоим нужно точное время, хотя метроном гораздо важнее.Я использовал ScheduledThreadPoolExecutor для метронома:
public void startMetronome() {
if (tempo > 0){
mainExecutor = new ScheduledThreadPoolExecutor(1);
t = mainExecutor.scheduleAtFixedRate(new MyTask(), 0, MILLIS_IN_MINUTE / tempo, TimeUnit.MILLISECONDS);
}
}
class MyTask implements Runnable {
@Override
public void run() {
playSound();
}
}
private void playSound() {
mp = MediaPlayer.create(this, R.raw.metronome);
mp.start();
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mp.release();
};
});
}
И простой CountDownTimer для таймера обратного отсчета:
public void startCounting(int minutes, int seconds){
mainCountDown = new CountDownTimer((minutes * 60 + seconds) * 1000, 1000) {
public void onTick(long millisUntilFinished) {
mMinutes = (int) TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished);
mSeconds = (int) (TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)));
CountDownView.setText(""+String.format("%d:%02d", mMinutes, mSeconds));
}
public void onFinish() {
startCountDown.setText("START");
}
}.start();
}
После тестирования по сравнению с метрономом Ableton на моем компьютере, метроном приложения (с запуском обратного отсчета), как оказалось, отстает даже без какого-либо взаимодействия с приложением.С другой стороны, все работало нормально, отсчет времени отключен.Каков наилучший способ достижения достаточно точного решения этих двух задач?