我启动一个新线程来播放音频。在 run 方法的开头,我首先创建一个 audiotrack
。然后我设置 audioTrack.setPlaybackPositionUpdateListener
在 audiotrack
完成时执行一些操作播放音频。最后,我调用 audiotrack.write()
来实际播放音频。
代码 fragment 如下:
@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
方法中执行 主
线程。
你们知道这种行为的原因以及如何使 endReached
在创建 audiotrack
的同一线程中触发吗?非常感谢任何帮助!
最佳答案
发生这种情况是因为你的线程没有 Looper(如 HandlerThread )。
尽管文档没有说明这一点,但如果创建 AudioTrack
的线程没有 Looper
,AudioTrack
将使用主循环器,它意味着事件将被调度到主线程的Handler
上,并在主线程上被触发。
关于java - 在线程中设置事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42268011/