SeekBar和TextView随机停止更新

时间:2014-08-14 14:17:43

标签: java android handler android-mediaplayer runnable

我是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");
        }
    }

日志会确认smMediaPlayer.getCurrentPosition()的值是它们应该是什么,并且即使在SeekBar和TextView停止更新后也会继续使用新的和正确的值进行更新。 Log的示例如下所示:0:11 4650

SeekBar和TextView总是一起停止更新,从来没有一个人继续更新而另一个人无法更新。

如果我在SeekBar和TextView停止更新后暂停播放,然后开始播放,SeekBar和TextView将跳转到正确的位置/值。

当这些值停止更新时,LogCat中没有错误。我的代码中没有其他地方可以打开新线程,重新启动mHandler或使用任何Runnables。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果未在UI线程上运行startPlayProgressUpdater(),则会发生这种情况。尝试像这样初始化你的mHandler:

  

private static Handler mHandler = new Handler(Looper.getMainLooper());

这样,在Runnable的run()内部创建的所有内容都将在UI Thread上运行。您还可以将视图用作处理程序,Runnable也可以在UI Thread上运行。