3

MediaStreamのメソッドのドキュメントにprepareAsync()は次のように書かれています。

プレーヤーを非同期で再生できるように準備します。データソースと表示面を設定した後、prepare()またはprepareAsync()を呼び出す必要があります。ストリームの場合は、prepareAsync()を呼び出す必要があります。これは、十分なデータがバッファリングされるまでブロックするのではなく、すぐに戻ります。

ストリームの再生に使用すると、どのような問題が発生する可能性がありますか?prepare()私は使っていてprepare()、トラブルに巻き込まれたことはありません。

逆に、私自身の場合、「prepareAsync()」を使用すると、ストリームが開始されません。'prepare()'を使用すると、ストリームはバッファリング期間(1s-2s)の後に開始され、正常に再生されます。なぜこれが非同期メソッドで発生するのですか?async prepareのフォームはと同じprepare()ですか?

    mPlayer = new MediaPlayer();
    mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mPlayer.setDataSource(STREAM_URL);
    mPlayer.prepareAsync();
    mPlayer.start();
4

2 に答える 2

3

問題は、スレッドprepare()をブロックすることです。UIメディアの準備に時間がかかりすぎると、アプリはANRエラーで強制終了されます。

その場合、スレッドを 1 ~ 2 秒間ブロックすることは、UIまったくクールではありません。Web サーバーにアクセスしている場合、遅かれ早かれ殺されることは間違いありません。

prepareAsync作業を開始するには、 を呼び出してから、ハンドラーMediaPlayer.setOnPreparedListenerを呼び出す必要があります。MediaPlayer.start()

于 2012-12-07T12:24:58.977 に答える
1

UIスレッドで複雑な操作を行うことは悪い習慣です。UIを長時間ブロックする可能性があり、Androidがアプリを強制終了する可能性があります。この場合、prepare()メソッドは、データのデコードとフェッチのために多くの時間がかかる可能性があります。

OnPreparedイベントをリッスンしているときに、prepareAsync()メソッドを呼び出す必要があります。イベントがトリガーされたら、UIに通知してプレーヤーを起動する必要があります。

mPlayer = new MediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setDataSource(STREAM_URL);
mplayer.setOnPreparedListener(/*your listener here*/)
mPlayer.prepareAsync();
于 2012-12-07T12:42:01.060 に答える