У мене є основні знання про витоки пам’яті та те, що може їх викликати. Тому я не розумію, чи є у мене проблема в коді чи це хибний позитив. Я не знаю, якою частиною коду я повинен поділитися, оскільки проект не малий. Але просто повідомте мене в коментарях, і я додам необхідний код.
Я використовую компонент арки навігації та дотримуюся схеми MVVM. Пізніше до розробки проекту я додав бібліотеку LeakCanary, і вона негайно почала видавати мені попередження про збережені випадки, коли я переходжу між екранами.
Проблема виникає, коли я додаю фрагменти до задньої стопки. З кожним доданим фрагментом до задньої стеки лічильник збережених екземплярів збільшується. Коли воно досягне порогового значення 5 LeakCanary скидає купу і надає звіт.
Але якщо я натискаю кнопку назад і повертаюсь до попередніх екранів, тоді лічильник збережених примірників зменшується і, зрештою, при поверненні на перший екран всі збережені екземпляри зникають.
Якщо я дивлюся на звіти про аналіз купи, це говорить, що змінна координаторLayout, яка є посиланням на CoordinatorLayout
xml, просочилася. Якщо я видаляю змінну та все її використання та запускаю програму ще раз, я бачу ту саму проблему, але тепер із іншою змінною, яка є посиланням на інший вигляд у xml. Я спробував видалити всі перегляди та їх використання, про які LeakCanary повідомив про протікання. Коли вона сказала, що a TextView
, який просто використовується для встановлення тексту onViewCreated
і не використовується ніде більше, протікає, я почав сумніватися, що в моєму коді є проблема.
Я проаналізував виклики методу життєвого циклу фрагментами і зауважив, що коли я переходжу до нового екрана попереднього фрагмента, всі методи до включення onDestroyView
отримують виклики, але ні onDestroy
. Коли я натискаю назад onDestroy
, викликається фрагмент, який знаходився вгорі заднього стека, а лічильник збережених примірників зменшується.
Я підозрюю, що компонент Навігація зберігає примірник фрагмента, коли він знаходиться в задній стек, і LeakCanary розглядає це як витік.
onDestroyView
Перегляд прив'язки".