我开始一个新线程来播放音频。在run方法的开头,我首先创建了一个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
?非常感谢任何帮助!
答案 0 :(得分:1)
这是因为你的线程没有Looper,(如HandlerThread)。
虽然文档没有说明这一点,但如果创建AudioTrack
的线程没有Looper
,AudioTrack
将使用主循环,这意味着事件将在{{{主线程的1}},将在主线程上触发。