Android SeekBar setProgress ist-was meinen MediaPlayer zu überspringen

Ich versuche, eine SeekBar-Komponente zur Anzeige der Länge des Stücks, gespielt von einem MediaPlayer-Klasse und ermöglichen die Suche innerhalb des Tracks.

Suche innerhalb des Tracks gut funktioniert. Jedoch, Aktualisierung der progress-Wert mit setProgress, während der track abgespielt zu verursachen scheint eine leichte überspringen.

In der onCreate-Methode erstelle ich einen Thread mit einer Schleife, die updates der SeekBar-Komponente, die Fortschritte der Wert für den aktuellen track. Diese Schleife wird zurückgesetzt, wenn die Spur gewechselt wird.

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();
}

Idealerweise würde ich eher nicht verwenden, einen thread so wie ich das verstehe, dass dies Nachteile hat. Auch entschuldigen Sie bitte die Ausnahme zu schlucken - es ist schwer zu halten die überprüfung für alle MediaPlayer-Staaten in Reaktion auf UI-Ereignisse. Aber mein eigentliches problem ist, dass die Musik überspringt.

Könnte jemand empfehlen, eine alternative Methode zur Aktualisierung der Fortschritte und erklären, warum der Aufruf von setProgress verursacht der track zu überspringen, auch mit der Verwendung von einem separaten thread?

Vielen Dank im Voraus.

Schreibe einen Kommentar