¿Este patrón de mensajería de Servicio de Actividad causa una pérdida de memoria?
Tengo un Service
trabajador, y un montón de actividades. Cada Activity
tiene un Handler
. Las Actividades pueden iniciar trabajos enviando Intents
al Service
con el método startService
. Estos trabajos entran en una cola y se procesan secuencialmente.
Para informar de los resultados de los trabajos terminados, suministro el controlador de actividad adecuado envuelto en un objeto Messenger con el Intent
que describe el trabajo. El Service
envía de vuelta algún mensaje para la Activity
llamada a través de este. Esto funciona muy bien.
- pérdida de memoria debido a llamada bitmapfactory
- Cambiar la actividad a AppCompatActivity utiliza más memoria RAM?
- No se pueden obtener asignaciones en Android 4.4.4
- ¿Cuánta memoria recibe cada proceso de Android?
- Error fatal: Adreno-GSL
Pero los Handlers
suministrados parecen permanecer en la memoria, incluso después de que las Activites
correspondientes Activites
destruidas, continuando con los mensajes de finalización.
- ¿Cómo puede ser esto? ¿No deberían ser destruidos los manejadores con la
Activity
que forman parte? - ¿Esto causa una pérdida de memoria?
- Ver reutilización en fragmentos android
- Uso de la memoria de aplicaciones Android de Xamarin
- Pasar Actividad Contexto para que los constructores lo utilicen internamente - ¿es esto malo?
- Pérdida de memoria causada por el método initialize de YouTubePlayer.Provider
- Bitmap recycle () en java Android
- OnDraw eficiente con mapas de bits y aceleración por hardware
- Android ViewPager con imágenes: pérdida de memoria / fallos de la aplicación
- Android: ¿Dónde está la herramienta Monitor de memoria?
Dado que el Servicio tiene una referencia a los Itnents que todavía tienen una referencia al Handler de Actividades entonces el Handler no va a estar disponible para Garbage Collection.
¿Has visto este video de Google IO ? Se trata de la creación de aplicaciones que utilizan los servicios web RESTful por lo que no es directamente pertinente, pero el enfoque de delegar la responsabilidad de responder a los eventos de larga duración en parte a su problema.
Si no desea cambiar demasiado las cosas, necesita una forma de actualizar sus actividades para que notifique al Servicio (ya través de él la Intención) de que la tarea de larga duración que está encargada no es necesaria. Elimina su referencia al Handler y así el GC puede deshacerse de él.
Que o centralizar la gestión (como en el vídeo) de las tareas de ejecución y responder a su ciclo de vida en una clase de ServiceHelper. Esa clase puede publicar eventos mientras las cosas suceden y las actividades pueden escuchar esos eventos.
Esto tiene el beneficio de que su código esté en un lugar para que no tenga que cambiar cada actividad cuando desee cambiar la forma en que maneja el servicio.