Правильное использование Android SeekBar? - PullRequest
0 голосов
/ 29 апреля 2011

Я пытался подключить 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 Ответ

3 голосов
/ 29 апреля 2011

Во-первых, рассмотрим <= вместо <.

Что еще более важно, вам не нужен фоновый поток с занятым циклом или он не нужен для этого.Сделайте что-то вроде:

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 в конце в этой точке.

...