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() } } 
  • La forma más fácil de usar Picasso en la notificación (icono)
  • Android: ¿Cuál es la forma más suave de sincronizar una base de datos remota en segundo plano?
  • WebViewClient shouldInterceptRequest Congela el WebView
  • TimerTask vs Thread.sleep vs Handler postDelayed - más preciso para llamar a la función cada N milisegundos?
  • Cómo crear un hilo Looper, a continuación, enviar un mensaje de inmediato?
  • Android: aumenta AlertDialog desde el subproceso de fondo
  • ¿Cómo utilizar "runOnUiThread (runnable)" dentro del método estático?
  • Android (en Scala): StackOverflowError depende de cuándo iniciar un hilo?
  • ¿Cómo puedo asegurar que el controlador de otro hilo no sea nulo antes de llamarlo?
  • Android: java.lang.Throwable: setStateLocked
  • Programación Android Camera.PreviewCallback (con OpenGL y OpenCV)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.