我尝试将SeekBar
插入到我的视频应用中,但它似乎没有到达栏的末尾。这是代码:
videoSeekBar = (SeekBar) activity.findViewById(R.id.videoPlayerSeek);
videoDuration = player.getDuration();
videoSeekBar.setMax(videoDuration);
videoSeekBar.setProgress(0);
// Start lengthy operation in a background thread
new Thread(new Runnable() {
public void run() {
while (videoPlayProgress < videoDuration) {
videoPlayProgress = player.getCurrentPosition();
// Update the progress bar
handler.post(new Runnable() {
public void run() {
videoSeekBar.setProgress(videoPlayProgress);
}
});
}
}
}).start();
然后,我有一个OnCompleteListener
附加到MediaPlayer。当它被调用时,
player.getCurrentPosition()
返回6209
player.getDuration()
返回6592
哪个不对。此时,滑块状态指示器不完全位于滑块的末端,但是有一个小的间隙。视频长度越短,差距越大。
答案 0 :(得分:3)
首先,请考虑<=
而不是<
。
更重要的是,您不需要或不需要繁忙的循环后台线程。去做类似的事情:
Runnable r=new Runnable() {
public void run() {
videoSeekBar.setProgress(player.getCurrentPosition());
if (player.getCurrentPosition()<player.getDuration()) {
videoSeekBar.postDelayed(r, 33);
}
}
};
当您的视频启动时,并在run()
上的某个地方致电r
。这将每秒更新SeekBar
约30次。
您当前的实施是一个前台繁忙的循环,将数千条消息发布到主应用程序线程的队列中,这将使您的视频播放性能更差,并且浪费电池没有特别的优势。
这仍然可能无法一直到达终点 - 视频可能会在setProgress()
通话和if
测试之间到达终点。它最终的真正考验是OnCompletionListener
,所以只需将SeekBar
定位在那一点。