2011-02-11 11 views
8

Estoy escribiendo un reproductor de audio con MediaPlayer que permite al usuario omitir la melodía real. Se puede producir una solicitud de omisión en cualquier momento, incluso entre una llamada a MediaPlayer.prepareAsync y la próxima devolución de llamada onPrepared. El documento dice:¿Es seguro reiniciar un MediaPlayer en el estado de preparación?

Es importante tener en cuenta que el estado de Preparación es un estado transitorio, y el comportamiento de llamar a cualquier método con efecto secundario mientras un objeto MediaPlayer está en el estado Preparación no está definido.

¿Eso incluye llamadas para restablecer, o incluso para liberar? Porque si es así, entonces tendría que esperar la devolución de llamada en preparación para reutilizar el MediaPlayer o asignar un nuevo MediaPlayer si no quiero esperar y liberar el obsoleto en la devolución de llamada en línea, ¿no?

Respuesta

3

En mi opinión, voy a seguir los consejos en los documentos, encontré varios problemas con el reproductor en diferentes dispositivos (en algunos dispositivos no es estable reutilizando al mismo jugador).

Creo que una buena opción es tener a los jugadores asignados, y cambiar entre ellos cuando el usuario salta una canción, luego esperas a que el jugador original llegue al estado preparado y luego lo restableces de manera segura.

+2

He leído en algún lado que las instancias de MediaPlayer son bastantes pesadas en recursos y que nunca debemos confiar en más de dos. Ya uso dos instancias: una para tocar la melodía real, la otra para preparar (y reproducir) la siguiente. Entonces, si MediaPlayer.release fue al menos válido en todo momento, entonces podría asegurarme de que no tenga más de dos instancias de MediaPlayer. – Simon

+0

Eso está bien, con dos instancias puede esperar a que el estado de preparación cambie al estado preparado antes de soltarlo, mientras que con el otro toca la siguiente canción. –

-1

Tengo un problema cuando MP se "cuelga" en el estado de preparación durante demasiado tiempo (transmisión) y estoy tratando de detenerlo usando reset(). Esto hace que MP se bloquee y, por lo tanto, toda mi aplicación se congela. Parece que no hay forma de detener a MP en la preparación del estado. Estoy pensando en usar prepare() envuelto en thread en lugar de prepareAsync(). Entonces podré matar ese hilo. Por ahora lo hice de la siguiente manera:

 try { 
      mp.setDataSource(new String()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      android.util.Log.d(TAG,"actionCancel(): mp.setDataSource() exception"); 
      mp.reset(); 
     } 

y funciona 4me.

+0

En su código, si la excepción está atrapada, es porque estaba tratando de establecer nuevos datos en su reproductor. Luego reinicia tu reproductor ... Pero finalmente no configuras tus datos para el jugador. –

+0

Simplemente no entendiste el truco porque probablemente no haya leído mi publicación. No necesito configurar ningún DataSource. Solo necesito detener/reiniciar MP en el estado de preparación. Y solo después de la captura de excepción finalmente pude usar el restablecimiento de manera segura. – Stan

+0

El doc dijo, que cito "Es importante tener en cuenta que el estado de Preparación es un estado transitorio, y el comportamiento de llamar a cualquier método con efecto secundario mientras un objeto MediaPlayer está en el estado Preparación no está definido". ¿Hay algún efecto secundario de usar de esta manera? – wukong

5

También construí un reproductor de música de transmisión y luché con el estado de preparación. La peor parte fue que había algunas secuencias donde prepare() colgaba para siempre la descarga (almacenamiento en búfer) de datos sin llamar a onBufferUpdate. La liberación de llamadas no hizo nada. Entonces, la forma en que lo hice fue llamar a reset() en el MediaPlayer atascado de otro texto después de 15 segundos a pesar de las recomendaciones en los documentos. Esto provocó que lanzara una excepción y la llevara al estado de error. Después de atrapar la excepción, llamé a release(). Esto parece haber resuelto el problema. Espero que esto sea útil para alguien.

Cuestiones relacionadas