Domanda

Sto cercando di utilizzare un SeekBar per visualizzare sia la lunghezza di un brano suonato da una classe MediaPlayer e per consentire alla ricerca all'interno della traccia.

In cerca all'interno della traccia funziona bene. Tuttavia, l'aggiornamento del valore di avanzamento utilizzando setProgress mentre la traccia è in riproduzione sembra causare un leggero salto.

Nel metodo onCreate ho creare un thread con un ciclo che aggiorna il valore progresso del SeekBar per la traccia corrente. Questo azzera ciclo quando la pista è cambiato.

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

Idealmente avrei preferito non utilizzare un filo mi pare di capire che questo ha degli svantaggi. Inoltre si prega di scusare la deglutizione eccezione - è difficile mantenere il controllo per tutti gli stati MediaPlayer in risposta ad eventi dell'interfaccia utente. Tuttavia, il mio vero problema è che la musica è saltare.

Qualcuno potrebbe suggerire un modo alternativo per aggiornare i progressi e spiegare perché la chiamata a setProgress sta causando la pista di saltare anche con l'uso di un filo separato?

Grazie in anticipo.

È stato utile?

Soluzione

Credo che il problema è che quando si chiama il setProgress (), l'evento onProgressChanged è sparato.

L'ascoltatore (OnSeekBarChangeListener) avere un metodo public void onProgressChanged (SeekBar seekBar, int progresso, FROMUSER booleano). Qui si dovrebbe verificare se l'ascoltatore è stato sparato da un azione dell'utente o dal codice. Nel tuo caso, la variabile FROMUSER dovrebbe essere falsa.

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()
        }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top