Android SeekBar setProgress вызывает пропуск моего MediaPlayer - PullRequest
15 голосов
/ 09 января 2011

Я пытаюсь использовать SeekBar для отображения длины дорожки, воспроизводимой классом MediaPlayer, и для включения поиска внутри дорожки.

Поиск в дорожке работает хорошо.Однако обновление значения прогресса с использованием setProgress во время воспроизведения дорожки, по-видимому, вызывает небольшой пропуск.

В методе onCreate я создаю поток с циклом, который обновляет значение прогресса SeekBar для текущей дорожки.Этот цикл сбрасывается при смене дорожки.

private void createProgressThread() {

    _progressUpdater = new Runnable() {
        @Override
        public void run() {
            //Exitting is set on destroy
            while(!_exitting) {
                _resetProgress = false;
                if(_player.isPlaying()) {
                    try
                    {
                        int current = 0;
                        int total = _player.getDuration();
                        progressBar.setMax(total);
                        progressBar.setIndeterminate(false);

                        while(_player!=null && current<total && !_resetProgress){
                            try {
                                Thread.sleep(1000); //Update once per second
                                current = _player.getCurrentPosition();
                                 //Removing this line, the track plays normally.
                                progressBar.setProgress(current); 
                            } catch (InterruptedException e) {

                            } catch (Exception e){

                            }            
                        }
                    }
                    catch(Exception e)
                    {
                        //Don't want this thread to intefere with the rest of the app.
                    }
                }
            }
        }
    };
    Thread thread = new Thread(_progressUpdater);
    thread.start();
}

В идеале я бы предпочел не использовать поток, поскольку я понимаю, что это имеет недостатки.Также прошу прощения за исключение проглатывания - сложно постоянно проверять все состояния MediaPlayer в ответ на события пользовательского интерфейса.Однако моя настоящая проблема в том, что музыка пропускается.

Может ли кто-нибудь предложить альтернативный способ обновления прогресса и объяснить, почему вызов setProgress приводит к пропуску дорожки даже при использовании отдельного потока?

Заранее спасибо.

1 Ответ

26 голосов
/ 09 января 2011

Я думаю, проблема в том, что когда вы вызываете setProgress (), вызывается событие onProgressChanged

У слушателя (OnSeekBarChangeListener) есть метод public void onProgressChanged (SeekBar seekBar, int progress, логическое значение от пользователя). Здесь вы должны проверить, был ли слушатель запущен действием пользователя или из кода. В вашем случае переменная fromUser должна быть ложной.

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    if(fromUser){
           player.seekTo(x);
        }
        else{
         // the event was fired from code and you shouldn't call player.seekTo()
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...