首页 文章

SeekBar和TextView随机停止更新

提问于
浏览
0

我是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

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

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

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

相关问题