gpt4 book ai didi

java - 在线程中设置事件监听器

转载 作者:行者123 更新时间:2023-12-01 08:52:56 31 4
gpt4 key购买 nike

我启动一个新线程来播放音频。在 run 方法的开头,我首先创建一个 audiotrack 。然后我设置 audioTrack.setPlaybackPositionUpdateListeneraudiotrack 完成时执行一些操作播放音频。最后,我调用 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 的线程没有 LooperAudioTrack 将使用主循环器,它意味着事件将被调度到主线程的Handler上,并在主线程上被触发。

关于java - 在线程中设置事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42268011/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com