У меня есть небольшое приложение, которое устанавливает таймер и воспроизводит наборы из 2 звуков один за другим.
Я пробовал 2 таймера, потому что хотел, чтобы оба звука каждый раз начинались точно в одно и то же время. Я дал приложению 500 мс для установки обоих таймеров до их запуска.
Calendar cal = Calendar.getInstance();
Date start = new Date(cal.getTime().getTime() + 500);
timerTask1 = new TimerTask() { //1st timer
@Override
public void run() {
soundManager.playSound(1);
}
};
timer1 = new Timer();
timer1.schedule(timerTask1, start, 550);
timerTask2 = new TimerTask() { //2nd timer
@Override
public void run() {
soundManager.playSound(2);
}
};
timer2 = new Timer();
timer2.schedule(timerTask2, start, 550);
}
soundManager — это объект SoundManager, основанный на этом руководстве. а>. Единственным изменением, которое я сделал, было уменьшение количества доступных потоков с 20 до 2, так как я воспроизводил только 2 звука одновременно.
Теперь проблема. Он не воспроизводится с одинаковой скоростью ни на моем Motorola RAZR, ни на эмуляторе. Приложение иногда тормозит, из-за чего тормозит дольше, чем хотелось бы. Я не могу этого допустить. Что здесь может быть не так?
Я использую очень короткие звуки в формате OGG.
РЕДАКТИРОВАТЬ: я провел некоторое исследование. Использовал 2 подхода. Я измерял миллисекунды расстояния между звуком. Частота обновления составляла 500 мс.
- Первым подходом был TimerTask - это большой провал. Он начался с 300 мс, затем постоянно рос и через некоторое время (2 минуты) стабилизировался на 497 мс, что было бы просто отлично, если бы оно началось так.
- 2-й подход был циклом while на AsyncTask - он давал мне результаты от 475 до 500 мс, что лучше, чем TimerTask, но все же неточно.
В конце ни один из подходов не играл гладко. Всегда были задержки
TimerTask
не гарантируется в реальном времени, поэтому я вполне могу себе представить, что что-то прерывает ваш процесс в течение 50 миллисекунд между каждым звуком. Во-вторых, кажется, что вызовsoundManager.playSound(1);
, а затемsoundManager.playSound(2);
будет воспроизводиться последовательно. - person Ken Y-N   schedule 20.08.2012