正确使用Android的SeekBar?

时间:2011-04-28 21:09:11

标签: android media-player seekbar

我尝试将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

哪个不对。此时,滑块状态指示器不完全位于滑块的末端,但是有一个小的间隙。视频长度越短,差距越大。

1 个答案:

答案 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定位在那一点。