¿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.

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?

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.

  • ¿Cómo puedo forzar la presión de memoria para la depuración de Android?
  • Cómo hacer que la aplicación de Android que "come" la memoria RAM
  • ¿Cuál es la cantidad máxima de RAM que una aplicación puede usar?
  • Android crea carpetas en el problema de memoria interna
  • Análisis de memoria en Android: dominator_tree no muestra todas las instancias de algunos objetos
  • Uso de memoria de Android AdMob
  • Android - view.Surface OutOfResourcesException
  • Aumento de la memoria de YouWave
  • Android OutOfMemory pero con memoria de sobra
  • Tamaño del montón de Android VM
  • Android: fugas de memoria al crear dinámicamente UI con fondos de recursos de imagen
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.