Android SeekBar setProgress está haciendo que mi MediaPlayer salte

Estoy intentando utilizar un SeekBar para exhibir la longitud de una pista jugada por una clase de MediaPlayer y para permitir la búsqueda dentro de la pista.

Buscar dentro de la pista funciona bien. Sin embargo, actualizar el valor de progreso utilizando setProgress mientras se reproduce la pista parece causar un ligero salto.

En el método onCreate creo un Thread 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 desventajas. También por favor disculpen la excepción deglución – es difícil seguir comprobando todos los estados de MediaPlayer en respuesta a eventos de interfaz de usuario. Sin embargo, mi verdadero problema es que la música está saltando.

¿Podría alguien sugerir una forma alternativa de actualizar el progreso y explicar por qué la llamada a setProgress está haciendo que la pista salte incluso con el uso de un hilo separado?

Gracias por adelantado.

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

El listener (OnSeekBarChangeListener) tiene un método public void onProgressChanged (SeeBBar seekBar, int progreso, boolean fromUser). Aquí debe probar si el oyente fue disparado por una acción del usuario o desde el 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() } } 
  • ¿Por qué el AsyncTask de mi servicio bloquea AsyncTasks de la actividad principal?
  • Clase de BlackBerry equivalente a AsyncTask?
  • Android (en Scala): StackOverflowError depende de cuándo iniciar un hilo?
  • Detalles técnicos de Android Garbage Collector
  • Cuando el hilo de trabajo funciona, la interfaz de usuario se vuelve intermitente
  • Error de Android Studio: "El método getText () debe ser llamado desde el subproceso de interfaz de usuario, el subproceso inferido actualmente es el trabajador
  • Contexto dentro de un Runnable
  • Aplicación android se estrella en el cambio de url de vista web
  • Cómo pausar y reanudar un subproceso de surfaceView
  • El AlertDialog es invisible cuando la actividad de nuevo a primer plano
  • Temporizador con devolución de llamada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.