2011-01-09 10 views
14

Estoy intentando utilizar una SeekBar para mostrar tanto la longitud de una pista reproducida por una clase MediaPlayer como para habilitar la búsqueda dentro de la pista.Android SeekBar setProgress hace que mi MediaPlayer omita

Buscar dentro de la pista funciona bien. Sin embargo, actualizar el valor de progreso usando setProgress mientras se reproduce la pista parece causar un pequeño salto.

En el método onCreate, creo un hilo con un bucle que actualiza el valor de progreso de SeekBar para la pista actual. Este bucle se restablece cuando se cambia la pista.

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 prefiero no usar un hilo ya que entiendo que esto tiene sus desventajas. También disculpe la excepción de tragar: es difícil seguir buscando todos los estados de MediaPlayer en respuesta a eventos de IU. Sin embargo, mi verdadero problema es que la música se está saltando.

¿Alguien podría sugerir una forma alternativa de actualizar el progreso y explicar por qué la llamada a setProgress hace que la pista se salte incluso con el uso de un hilo separado?

Gracias de antemano.

Respuesta

23

Creo que el problema es que cuando llama a setProgress(), se desencadena el evento onProgressChanged.

El detector (OnSeekBarChangeListener) tiene un método public void onProgressChanged (SeekBar seekBar, int progress, boolean fromUser). Aquí debe probar si el oyente fue despedido por una acción del usuario o por un código. En su caso, la variable fromUser debe ser 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() 
     } 
} 
+0

Spot on. Gracias. –

+0

¡BRILLIANT, descubrió este problema después de un día de depuración desesperada e impotente! :) Gracias. – Soham

Cuestiones relacionadas