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

标签 java android multithreading audiotrack

我启动一个新线程来播放音频。在 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/

相关文章:

android - 如何从任何地方获取包名?

android - Python 作为 Android 构建要求

python - Python多线程时queue.Queue的正确实现

c++ - 并行线程,QT

java - LibGDX - batch.begin(); 之间有什么不同?和 renderer.getBatch().begin();?

java - 看来Thread.start()做了一个notify()

java - 代码不通过 Volley 向 mysql 发送数据

java - 我正在尝试使用 Java 和递归解决 "knapsack"问题

java - 如何将主依赖项标记为 "compile",将子依赖项标记为 "provide"?

Java:检查 String.contains 是否匹配确切的词