我是Android编程的新手,所以我可能犯了一个简单的错误 . 我已经实现了一个带有相应SeekBar和TextView(倒计时)的MediaPlayer . 大约一半的时间,SeekBar和TextView在播放期间停止更新 . 我正在播放的音频文件很短,最长时间为60秒....在这种特殊情况下,我的文件长度为10-15秒 .
相应的更新功能如下:
private static MediaPlayer mMediaPlayer;
private static SeekBar mSeekBar;
private static TextView mClock;
private static Handler mHandler = new Handler();
.
.
.
private void startPlayProgressUpdater() {
if(mMediaPlayer != null && mMediaPlayer.isPlaying()) {
final String s = OyoUtils.constructMinSec(mMediaPlayer.getDuration() - mMediaPlayer.getCurrentPosition());
Log.e("",s + " " + mMediaPlayer.getCurrentPosition());
mSeekBar.setProgress(mMediaPlayer.getCurrentPosition());
mClock.setText(s);
Runnable update = new Runnable() {
public void run() {
startPlayProgressUpdater();
}
};
mHandler.postDelayed(update, 200);
} else {
Log.e("","Not playing");
}
}
日志确认 s
和 mMediaPlayer.getCurrentPosition()
的值是它们应该是什么,并且即使在SeekBar和TextView停止更新后仍继续使用新的和正确的值进行更新 . Log的示例如下所示: 0:11 4650
SeekBar和TextView总是一起停止更新,从来没有一个人继续更新而另一个人无法更新 .
如果我在SeekBar和TextView停止更新后暂停播放,然后开始播放,SeekBar和TextView会跳转到正确的位置/值 .
当这些值停止更新时,LogCat中没有错误 . 我的代码中没有其他地方可以打开新线程,重新启动mHandler或使用任何Runnables .
有任何想法吗?
1 回答
如果startPlayProgressUpdater()未在UI线程上运行,则会发生这种情况 . 尝试像这样初始化你的mHandler:
这样,在Runnable的run()内部创建的所有内容都将在UI Thread上运行 . 您还可以将视图用作处理程序,Runnable也可以在UI线程上运行 .