Две одновременные срочные задачи - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь создать приложение для моей игры на гитаре, в котором одновременно выполняются две вещи - метроном и таймер обратного отсчета.Им обоим нужно точное время, хотя метроном гораздо важнее.Я использовал 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 на моем компьютере, метроном приложения (с запуском обратного отсчета), как оказалось, отстает даже без какого-либо взаимодействия с приложением.С другой стороны, все работало нормально, отсчет времени отключен.Каков наилучший способ достижения достаточно точного решения этих двух задач?

...