Tengo un conocimiento básico de las pérdidas de memoria y de lo que puede causarlas. Es por eso que no entiendo si tengo un problema en mi código o es un falso positivo. No sé qué parte del código debo compartir ya que el proyecto no es pequeño. Pero solo házmelo saber en los comentarios y agregaré el código requerido.
Uso el componente de arco de navegación y sigo el patrón MVVM. Agregué la biblioteca LeakCanary más adelante en el desarrollo del proyecto e inmediatamente comenzó a darme advertencias sobre instancias retenidas cuando navego entre pantallas.
El problema ocurre cuando agrego fragmentos a la pila posterior. Con cada fragmento agregado a la pila posterior, aumenta el contador de instancias retenidas. Cuando alcanza el valor umbral de 5, LeakCanary volca el montón y proporciona un informe.
Pero si hago clic en el botón Atrás y vuelvo a las pantallas anteriores, el contador de instancias retenidas disminuye y, finalmente, cuando se regresa a la primera pantalla, todas las instancias retenidas desaparecen.
Si miro los informes de análisis de montón, dice que se CoordinatorLayout
ha filtrado la variable coordinatorLayout, que es una referencia a in xml. Si elimino la variable y todo su uso y ejecuto la aplicación nuevamente, veo el mismo problema, pero ahora con otra variable que es una referencia a otra vista en xml. Traté de eliminar todas las vistas y su uso que LeakCanary informó que se filtró. Cuando decía que a TextView
, que solo se usa para establecer un texto onViewCreated
y no se usa en ningún otro lugar, está goteando, comencé a dudar de que haya un problema en mi código.
Analicé las llamadas al método del ciclo de vida en fragmentos y noté que cuando navego a una nueva pantalla para el fragmento anterior, todos los métodos hasta e inclusive onDestroyView
se llaman pero no onDestroy
. Cuando hago clic en Atrás, onDestroy
se solicita un fragmento que estaba encima de la pila de respaldo y el contador de instancias retenidas disminuye.
Sospecho que el componente de navegación mantiene la instancia de un fragmento cuando está en la pila trasera y LeakCanary lo ve como una fuga.
onDestroyView
con el enlace de vista.