android - Débil referencia para la devolución de llamada de red mala idea?
memory-leaks callback (3)
Creo que debes usar referencia débil para la clase externa pero no para la devolución de llamada. No es la devolución de llamada realmente la fuga sino la clase externa. Significa que, la devolución de llamada que está utilizando no es la que se debe recopilar, sino la devolución de llamada.
Responda si tiene alguna pregunta :)
En nuestro proyecto encontramos fugas de memoria debido a devoluciones de llamadas de red. La solicitud de red se dispara desde un fragmento y la respuesta vuelve a través de una devolución de llamada al fragmento. El problema es que cuando el usuario abandona el fragmento, no es basura recolectada ya que la devolución de llamada está vinculada a él. Por lo tanto, hay una fuga de memoria.
Mi solución propuesta era anular la referencia de devolución de llamada en onStop of fragment. De esa forma, GC puede encargarse de eso.
Otra solución que mi compañero de trabajo sugirió es usar WeakReference para las devoluciones de llamada. El problema es que la devolución de llamada se recolecta a menudo, de manera que ni siquiera recibimos respuesta de las devoluciones de llamada (algunas veces cuando el usuario está esperando una respuesta). El problema es que la referencia débil puede ser recogida de basura utilizando GC en cualquier momento.
Supongo que en este escenario, usar WeakReference no es una buena idea.
Qué piensan ustedes ?
De acuerdo con ambas respuestas Gracias por tomarse el tiempo para responder.
La solución fue envolver el "fragmento" en la referencia débil y no en la devolución de llamada, de modo que cuando se complete la operación de la red, verifique si el fragmento todavía está activo. GC recogerá el fragmento cuando no está cerca.
Creo que la WeakReference para el escucha de devolución de llamada no es un buen patrón, porque el oyente de devolución de llamada puede ser GC muy fácilmente, por lo que nunca se llamará a la devolución de llamada. Sin embargo, estoy totalmente de acuerdo con la respuesta de @MacFang. It''s not the callback really leak but the outer class
.