Android SeekBar setProgress заставляет мой MediaPlayer пропускать

I ' m пытается использовать 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 вызывает пропуск дорожки даже при использовании отдельного потока?

Заранее благодарим.

15
задан Community 9 April 2019 в 19:36
поделиться