У меня есть базовые знания об утечках памяти и о том, что может их вызвать. Вот почему я не понимаю, если у меня есть проблема в моем коде или это ложный положительный результат. Я не знаю, какой частью кода я должен поделиться, так как проект не маленький. Но просто дайте мне знать в комментариях, и я добавлю необходимый код.
Я использую компонент навигационной арки и следую шаблону MVVM. Позже я добавил библиотеку LeakCanary при разработке проекта, и она сразу же начала давать мне предупреждения о сохраненных экземплярах при переходе между экранами.
Проблема возникает, когда я добавляю фрагменты в задний стек. С каждым добавленным фрагментом в задний стек счетчик сохраненных экземпляров увеличивается. Когда он достигает порогового значения 5, LeakCanary сбрасывает кучу и выдает отчет.
Но если я нажму кнопку «Назад» и вернусь к предыдущим экранам, то счетчик сохраненных экземпляров уменьшится, и в конечном итоге, когда вернется на 1-й экран, все сохраненные экземпляры исчезнут.
Если я посмотрю на отчеты по анализу кучи, то там будет сказано, что переменная координаторLayout, которая является ссылкой на CoordinatorLayout
XML, просочилась. Если я удаляю переменную и все ее использование и снова запускаю приложение, я вижу ту же проблему, но теперь с другой переменной, которая является ссылкой на другое представление в xml. Я попытался удалить все виды и их использование, которые LeakCanary сообщил как утечка. Когда он сказал, что a TextView
, который просто используется для установки текста onViewCreated
и не используется где-либо еще, протекает, я начал сомневаться, что в моем коде есть проблема.
Я проанализировал вызовы методов жизненного цикла во фрагментах и заметил, что при переходе к новому экрану для предыдущего фрагмента все методы до и включая onDestroyView
вызываются, но неonDestroy
. Когда я нажимаю назад, onDestroy
вызывается фрагмент, который был на вершине заднего стека, и счетчик сохраненных экземпляров уменьшается.
Я подозреваю, что компонент Navigation хранит экземпляр фрагмента, когда он находится в заднем стеке, а LeakCanary видит в нем утечку.
onDestroyView
с помощью View Binding.