我试图在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。
答案 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();
}
您还可以考虑为所有可发布消息使用单个处理程序。
答案 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);
}
});