0

我尝试将 aSeekBar插入我的视频应用程序,但它似乎永远不会到达栏的尽头。这是代码:

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

这不可能是对的。此时,滑块状态指示器还没有完全位于滑块条的末端,但有一点间隙。视频的长度越短,差距就越大。

4

1 回答 1

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放在末尾即可。

于 2011-04-28T21:30:50.950 回答