2

私の場合、オーディオをストリーミングしてその進行状況を単純な ProgressBar に表示したいのですが、進行状況を再生するためのイベント ハンドラーが見つかりませんでした。続く

public void fireRunnable()
{
    Runnable runnable = new Runnable()
    {
        @Override
        public void run()
        {
            int duration = mediaPlayer.getDuration();
            while( mediaPlayer.isPlaying() )
            {
                Log.v("", mediaPlayer.getCurrentPosition()+"");
            }
        }
    };
    runnable.run();
}

そして onPrepared() で再生直後に呼び出します

@Override
public void onPrepared(MediaPlayer arg0)
{
    arg0.start();
    fireRunnable();
}

曲はオーディオなしで始まり、その後 5 秒ほどでアプリケーションがクラッシュします。これは良いアプローチですか? はいの場合、どうすれば動作させることができますか? またはいいえ、他にどのようなオプションがありますか?
助けていただければ幸いです。

4

1 に答える 1

5

Runnableあなたが示したようにを使用することを選択した場合は、それを別のもので実行し、 UI スレッドで変更を戻すためにThread使用する必要があります。post(Runnable)あなたが言及したクラッシュは、UI スレッドに非常にアクティブな while ループがあるために発生する可能性があります。別のスレッドを開始する場合でもThread.sleep(long)、プログレス バーはそれほど正確である必要はないため、ループを呼び出してプロセッサ時間を確保する必要があります。

もう 1 つの方法は、わずかな遅延 (たとえば、500 ミリ秒) の後に繰り返し再投稿する を使用postDelayed(Runnable, long)することです。Runnable状況によっては、余分なスレッドを回避するため、この方法がおそらく好まれます。

isPlaying()また、 が一時停止している場合は false になることに注意してくださいMediaPlayer。プログレスバーの更新を停止する条件として、boolean メンバーを使用することをお勧めします。プログレス バーの更新を開始する前に true に設定し、 のOnCompletionListener.onCompletion()コールバックでfalse に設定しますMediaPlayer

編集:

UI スレッドについて言及post(Runnable)したとき、他のスレッドから UI 要素を変更することは違法であるという事実に言及していました。この場合、おそらく UI 要素を明示的に変更するのではなく、プログレス バーの状態のみを変更しているので問題ありません。

編集:(postDelayedバージョン)

あなたのActivity

private boolean mUpdateProgress = false;
private Runnable mUpdateRunnable = new Runnable() {
    @Override
    public void run() {
        // update progress bar using getCurrentPosition()
        if (mUpdateProgress)
            postDelayed(mUpdateRunnable, 500);
    }
}
private MediaPlayer.OnCompletionListener mComplete =
    new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion() {
            mUpdateProgress = false;
        }
    }

を作成する場所はどこでも、次MediaPlayerを呼び出します。

mediaPlayer.setOnCompletionListener(mComplete);

を開始する場所で、次の操作MediaPlayerを行います。

// update the duration of the progress bar
mUpdateProgress = true;
post(mUpdateRunnable); // or simply mRunnable.run() if you are on the main thread
mediaPlayer.start();
于 2013-10-02T03:01:02.377 に答える