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();