Я запускаю новый поток для воспроизведения аудио. В начале метода запуска я сначала создаю audiotrack
. Затем я установил audioTrack.setPlaybackPositionUpdateListener
, чтобы сделать некоторые вещи, когда audiotrack
закончил воспроизведение аудио. В конце концов я звоню audiotrack.write()
, чтобы фактически воспроизвести аудио.Настройка прослушивателя событий в потоке
Фрагмент кода вниз ниже:
@Override
public void run() {
audioTrack = new AudioTrack(listenerService.m_amAudioManager.STREAM_VOICE_CALL, listenerService.sampleRate, AudioFormat.CHANNEL_OUT_MONO, listenerService.audioFormat, listenerService.minBufSize/8, AudioTrack.MODE_STREAM);
audioTrack.setPlaybackPositionUpdateListener(new AudioTrack.OnPlaybackPositionUpdateListener() {
@Override
public void onMarkerReached(AudioTrack track) {
endReached();
}
});
audioTrack.play();
audioTrack.setNotificationMarkerPosition(959);
audioTrack.write(rReadShortBuffer, 0, rReadShortBuffer.length);
audioTrack.flush();
}
public void endReached(){
....
}
Моя проблема заключается в том, что я ожидаю, что метод reachEnd()
будут выполнены в том же потоке, в котором audiotrack
создается. Поскольку прослушиватель событий принадлежит audiotrack
, а audiotrack
порождается и устанавливает это событие в этом потоке. Таким образом, все содержимое должно содержаться в этом потоке. Это имеет смысл для меня. Но программа не работает так, как предполагалось. Поток, который создает audiotrack
, кажется, завершается после выполнения всего кода внутри метода run()
, а затем reachEnd
метод выполняется в потоке main
.
Вы, ребята, знаете причину этого поведения и как сделать endReached
уволенными в том же потоке, что и созданный audiotrack
? Любая помощь высоко ценится!
Воспроизведение достигло маркера, потому что я мог отлаживать событие слушателя (endReached). Но потом я обнаружил, что текущий поток был в главной теме. Возможно, это связано с тем, что поток, создающий аудиотрек, завершился после того, как весь код был запущен в методе запуска, и нет цикла или сна, чтобы блокировать его. – user1870797
@pskink, как вы думаете, поток, создавший audiotrack, будет немедленно разорван, как только он запустится до конца метода run. Поэтому, когда событие воспроизведения срабатывает, система помещает событие в основной поток ui для обработки, так как не может найти исходный поток, создавший аудиотрек. – user1870797
@pskink, Кажется, что что-то не так с моей сетью. Я не могу получить доступ к pastebin.com. Прямо сейчас я могу использовать обработчик и петлитель. Я расскажу вам о результате, как только я это сделаю. – user1870797