Referencia débil para la llamada de red mala idea?
En nuestro proyecto encontramos fugas de memoria debido a 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 deja el fragmento, su no basura recogida desde la devolución de llamada está vinculado a ella. Por lo tanto, hay un escape de memoria.
Mi solución propuesta era anular la referencia de devolución de llamada en onStop de fragmento. De esa manera, GC puede encargarse de ello.
- Android Asyntask: Usar referencia débil para el contexto para evitar la rotación del dispositivo de pantalla
- ¿Por qué usar WeakReference en los oyentes de Android?
- ¿Cómo usar WeakReference en el desarrollo de Java y Android?
- trabajar con imágenes grandes en android
- ¿Hashmap débil con referencias débiles a los valores?
Otra solución que mi compañero de trabajo sugirió es usar a WeakReference para las devoluciones de llamada. El problema con eso es que la devolución de llamada obtiene la basura recopilada a menudo tal que ni siquiera obtener respuesta de las devoluciones de llamada (algún tiempo s cuando el usuario está esperando una respuesta). El problema es Weak Reference puede ser recolectado basura usando GC en cualquier momento.
Supongo que en este escenario, el uso de WeakReference no es una buena idea.
Qué piensan ustedes ?
- Weakreference get () método ¿qué tan seguro es? (Android, asynctask)
- Patrón de WeakReference / AsyncTask en android
- Android MVP WeakRefrence
- Pruebe una referencia débil antes de usar java
- Si los adaptadores en Android son clases internas estáticas o clases internas no estáticas
- ¿Cuáles son los beneficios de usar WeakReferences?
- SQLiteOpenHelper sincronización
- Controlador Android que cambia WeakReference
Creo que deberías usar una referencia débil para la clase externa, pero no la devolución de llamada. No es la devolución de llamada realmente fugas sino la clase exterior. Significa que la devolución de llamada que está utilizando no es la que se debe recopilar sino la devolución de llamada.
Contéstame si tienes alguna pregunta 🙂
Creo que la WeakReference para el oyente de callback no es un buen patrón, porque el oyente de devolución de llamada puede ser GC con mucha facilidad, entonces hacer que usted callback nunca se llama. Sin embargo estoy totalmente de acuerdo con @MacFang respuesta It's not the callback really leak but the outer class
.
De acuerdo con ambas respuestas. Gracias por tomar tiempo para responder.
La solución era envolver el "fragmento" en la referencia débil y no en la devolución de llamada, de modo que cuando la operación de red se haya completado, compruebe si el fragmento sigue vivo. GC recogerá el fragmento cuando no esté cerca.