新しいスレッドを開始してオーディオを再生します。 runメソッドの初めに、最初にaudiotrack
を作成します。audiotrack
がオーディオを再生し終えたら、私はaudioTrack.setPlaybackPositionUpdateListener
に何かをするように設定しました。最後に、実際にオーディオを再生するには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()
メソッド内のすべてのコードを実行した後に終了し、main
スレッドでreachEnd
メソッドが実行されたようです。
あなたはこの動作の理由と、をaudiotrack
を作成したスレッドと同じスレッドで実行させる理由を知っていますか?どんな助けでも大歓迎です!
リスナーイベント(endReached)にデバッグできるため、再生がマーカーに到達しました。しかし、私は現在のスレッドがメインのUIスレッドにあることを発見しました。おそらく、audiotrackを作成するスレッドは、すべてのコードがrunメソッドで実行され、ブロックされないようにするためのループやスリープがないと終了している可能性があります。 – user1870797
@pskink、audiotrackを作成したスレッドは、runメソッドの最後まで実行されるとすぐに終了すると思いますか?そのため、再生イベントが発生すると、システムはaudiotrackを作成した元のスレッドを見つけることができないため、イベントをメインUIスレッドに送ります。 – user1870797
@pskink、ネットワークに問題があるようです。私はpastebin.comにアクセスできません。今私はハンドラとルーパーを使用して管理しています。私はそれが完了したら、結果についてあなたに教えてくれるでしょう。 – user1870797