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.
- ¿La imagen tarda demasiado en cargarse?
- Manejo de InterruptedException mientras espera una señal de salida (error en Android?)
- ¿Cuál es el propósito de sSyncAdapterLock en la muestra SyncService?
- RxJava - subir archivos secuencialmente - emitir el siguiente elemento, cuando onNext llamado
- ¿Cómo implementar la función .get con FutureTask o BackgroundTask usando android?
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.
- ¿Cómo detener Handler Runnable?
- Arquitectura de aplicaciones de Android: basada en eventos o en capas
- ¿Cuándo usar un hilo o servicio en Android?
- Retardo de tiempo en Android
- Uso de OpenGL desde el hilo principal de Android
- Android wait () no funciona
- ¿Cómo ejecutar una función cada dos segundos en Java en Android?
- ¿Cuándo debo usar cada uno de los diferentes tipos de mensajería de Android?
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() } }
- Com.google.android.gms.internal.zzhu: no se puede encontrar la clase referenciada android.security.NetworkSecurityPolicy
- Habilitar GPS programáticamente Android (sin navegar a los ajustes de ubicación)