在线程中设置事件侦听器

时间:2017-02-16 07:57:09

标签: java android multithreading audiotrack

我开始一个新线程来播放音频。在run方法的开头,我首先创建了一个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被生成并在此线程中设置该事件。因此所有内容都应包含在此线程中。这对我来说很有意义。但程序并没有按照假设运行。创建audiotrack的线程似乎在执行run()方法中的所有代码后终止,然后在reachEnd线程中执行main方法。

你们是否知道这种行为的原因以及如何在与创建endReached的线程相同的线程中触发audiotrack?非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

这是因为你的线程没有Looper,(如HandlerThread)。 虽然文档没有说明这一点,但如果创建AudioTrack的线程没有LooperAudioTrack将使用主循环,这意味着事件将在{{{主线程的1}},将在主线程上触发。