【发布时间】:2017-02-16 07:57:09
【问题描述】:
我开始一个新线程来播放音频。在run方法的开始,我首先创建了一个audiotrack。然后我设置audioTrack.setPlaybackPositionUpdateListener在audiotrack播放完音频后做一些事情。最后,我打电话给audiotrack.write() 来实际播放音频。
代码 sn-p 在下面:
@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() 方法内的所有代码后终止,然后在main 线程中执行reachEnd 方法。
你们知道这种行为的原因以及如何使endReached 在与创建audiotrack 的线程相同的线程中触发吗?非常感谢任何帮助!
【问题讨论】:
-
播放确实到达了标记,因为我可以调试到侦听器事件(endReached)。但后来我发现当前线程在主 ui 线程中。可能是因为创建音轨的线程在 run 方法中执行完所有代码后已经终止,并且没有循环或睡眠来阻止它。
-
@pskink,你认为创建音轨的线程一旦运行到运行结束方法就会立即终止。所以当播放事件触发时,由于找不到创建音轨的原始线程,系统会将事件交给主ui线程处理。
-
@pskink,我的网络好像有问题。我无法访问 pastebin.com。现在我正在设法使用处理程序和活套。完成后我会告诉你结果。
-
非常感谢。让我试一试。
-
@pskink,它失败了。播放事件仍然在主 ui 线程中触发。我要试试yosriz的方法。完成后我会告诉你的。
标签: java android multithreading audiotrack