SeekBar更新不起作用

时间:2015-02-18 00:14:30

标签: android seekbar

我试图在Android应用程序中创建视频播放器,我想在视频播放时更新SeekBar。这是我的代码,其中第一行是OnCreate方法:

seekBar = (SeekBar) findViewById(R.id.seekBar);
seekBar.setOnSeekBarChangeListener(change);

private OnSeekBarChangeListener change = new OnSeekBarChangeListener() {

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
    int progress = seekBar.getProgress();
    if (vv_video != null && vv_video.isPlaying()) {
        // Set the position of the currently playing
        vv_video.seekTo(progress);
    }
 }

 @Override
 public void onStartTrackingTouch(SeekBar seekBar) {

 }

 @Override
 public void onProgressChanged(SeekBar seekBar, int progress,
             boolean fromUser) {

 }
};

在Play方法中,我尝试了以下方法:

protected void play(int msec) {
.....
     seekBar.setMax(vv_video.getDuration());
     // To update the progress bar thread, scale
     new Thread() {
         @Override
         public void run() {
             try {
                 isPlaying = true;
                 while (vv_video.isPlaying()) {
                     int current = vv_video.getCurrentPosition();
                     seekBar.setProgress(current);

                     sleep(500);
                 }
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }
     }.start();
}

这不起作用;在播放视频时,我的seekBar始终位于Position = 0。

2 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为您正在尝试从其他线程更新GUI线程。你需要做的是将一个runnable发布到GUI线程。

void play() {

    new Thread() {
        void run() {

            // Do stuff
            seekBar.post(new Runnable() {

                void run() {

                    // Update UI thread
                    seekBar.setProgress(10);
                }
            });
        }
    }.start();
}

您还可以考虑为所有可发布消息使用单个处理程序。

See this Android documentation.

答案 1 :(得分:0)

您必须在UI线程本身更新搜索栏,并且可以使用runnable完成此操作。试试这个:

private Handler mHandler = new Handler();
//Make sure you update Seekbar on UI thread
MainActivity.this.runOnUiThread(new Runnable() {

@Override
public void run() {
    if(mMediaPlayer != null){
        int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;
        mSeekBar.setProgress(mCurrentPosition);
    }
    mHandler.postDelayed(this, 1000);
}
});