在线程中设置事件监听器
Setting event listener in a thread
我开始一个新线程来播放音频。在 运行 方法的开头,我在 first.Then 处创建了一个 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
被派生并在此 thread.So 中设置该事件,所以所有内容都应包含在此线程中。这对于 me.But 程序不是按预期的方式 运行 是有意义的。创建 audiotrack
的线程似乎在执行 run()
方法内的所有代码后终止,然后 reachEnd
方法在 main
线程中执行。
你们知道这种行为的原因以及如何使 endReached
在与创建 audiotrack
的线程相同的线程中触发吗?非常感谢任何帮助!
发生这种情况是因为您的线程没有 Looper(例如 HandlerThread)。
尽管文档没有说明这一点,但如果创建 AudioTrack
的线程没有 Looper
,AudioTrack
将使用主循环程序,这意味着事件将安排在 Handler
的主线程,并将在主线程上触发。
我开始一个新线程来播放音频。在 运行 方法的开头,我在 first.Then 处创建了一个 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
被派生并在此 thread.So 中设置该事件,所以所有内容都应包含在此线程中。这对于 me.But 程序不是按预期的方式 运行 是有意义的。创建 audiotrack
的线程似乎在执行 run()
方法内的所有代码后终止,然后 reachEnd
方法在 main
线程中执行。
你们知道这种行为的原因以及如何使 endReached
在与创建 audiotrack
的线程相同的线程中触发吗?非常感谢任何帮助!
发生这种情况是因为您的线程没有 Looper(例如 HandlerThread)。
尽管文档没有说明这一点,但如果创建 AudioTrack
的线程没有 Looper
,AudioTrack
将使用主循环程序,这意味着事件将安排在 Handler
的主线程,并将在主线程上触发。