studio programacion herramientas fundamentos con avanzado aplicaciones android multithreading service streaming media-player

android - programacion - ¿Debería un MediaPlayer ejecutarse en un hilo separado?



manual de android en pdf (3)

No, si está haciendo una transferencia de red, debe mantener eso en un hilo, el reproductor de medios no consume tantos recursos. Manténlo en tu actividad.

Estoy construyendo una aplicación que transmite música desde un servidor web. La aplicación tiene un servicio de primer plano que usa un MediaPlayer para la reproducción.

Mi código se basa en este ejemplo: http://developer.android.com/guide/topics/media/mediaplayer.html

En el ejemplo, no se enhebra nada excepto la llamada a prepareAsync (). Lo que me confunde es que cuando leo sobre la clase de Servicio encuentro esta información:

"Precaución: un servicio se ejecuta en el hilo principal de su proceso de alojamiento: el servicio no crea su propio hilo y no se ejecuta en un proceso separado (a menos que especifique lo contrario). Esto significa que, si su servicio va a hacer cualquier Trabajo intensivo de la CPU u operaciones de bloqueo (como reproducción de MP3 o redes), debe crear un nuevo hilo dentro del servicio para hacer ese trabajo. Al usar un hilo separado, reducirá el riesgo de errores de la aplicación que no responde (ANR) y el el hilo principal de la aplicación puede permanecer dedicado a la interacción del usuario con sus actividades ".

La razón por la que estoy preguntando es que la aplicación algunas veces (generalmente cuando se pierde la conexión) congela la IU cuando se transmite audio. Entiendo totalmente que la IU se congela si el servicio hace que la CPU haga un trabajo intenso, ya que la actividad y el servicio se ejecutan en el mismo hilo. Pero, ¿debería esperar que el MediaPlayer sea así de intenso? Es decir, ¿debería ejecutarse en un hilo separado?


¿Podría la música de transmisión causar que el hilo principal se detenga hasta que la música haya terminado de transmitirse? Esta podría ser la razón por la que está ralentizándolo.

No soy un experto y actualmente me estoy aprendiendo, pero vale la pena pensar en ello.


Desafortunadamente, llamar a prepareAsync () simplemente no es lo suficientemente bueno para evitar las solicitudes ANR y la aplicación se cuelga por unos segundos, especialmente si está reproduciendo un archivo de la red. Su mejor opción es colocar su instancia de MediaPlayer en su propio hilo, o al menos ejecutar llamadas intensivas en un mediaplayer.start() como mediaplayer.start() ). He estado usando MediaPlayer durante más de un año y puedo decir que definitivamente se cuelga después de varias llamadas, dependiendo de las circunstancias.