我是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。
有什么想法吗?
答案 0 :(得分:0)
如果未在UI线程上运行startPlayProgressUpdater(),则会发生这种情况。尝试像这样初始化你的mHandler:
private static Handler mHandler = new Handler(Looper.getMainLooper());
这样,在Runnable的run()内部创建的所有内容都将在UI Thread上运行。您还可以将视图用作处理程序,Runnable也可以在UI Thread上运行。