在线程中设置事件监听器

Setting event listener in a thread

我开始一个新线程来播放音频。在 运行 方法的开头,我在 first.Then 处创建了一个 audiotrack 我设置 audioTrack.setPlaybackPositionUpdateListeneraudiotrack 播放完音频后做一些事情。最后,我调用 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 的线程没有 LooperAudioTrack 将使用主循环程序,这意味着事件将安排在 Handler 的主线程,并将在主线程上触发。