Mam podstawową wiedzę na temat wycieków pamięci i ich przyczyn. Dlatego nie rozumiem, czy mam problem z kodem, czy jest to fałszywy alarm. Nie wiem, którą część kodu powinienem udostępnić, ponieważ projekt nie jest mały. Ale daj mi znać w komentarzach, a dodam wymagany kod.
Używam elementu arch nawigacji i kieruję się wzorem MVVM. Później dodałem bibliotekę LeakCanary podczas opracowywania projektu i od razu zaczęła ostrzegać mnie o zachowanych instancjach podczas nawigacji między ekranami.
Problem występuje, gdy dodam fragmenty do tylnego stosu. Z każdym dodanym fragmentem do tylnego stosu wzrasta liczba zachowanych instancji. Kiedy osiągnie wartość progową 5 LeakCanary, zrzuca stos i dostarcza raport.
Ale jeśli kliknę przycisk Wstecz i wrócę do poprzednich ekranów, licznik zachowanych wystąpień zmniejszy się, a ostatecznie, po powrocie do pierwszego ekranu wszystkie zachowane wystąpienia znikną.
Jeśli spojrzę na raporty analizy sterty, to mówi, że CoordinatorLayout
wyciekła zmienna koordynatorLayout, która jest odniesieniem do pliku xml. Jeśli usunę zmienną i całe jej użycie i ponownie uruchomię aplikację, widzę ten sam problem, ale teraz z inną zmienną, która jest odniesieniem do innego widoku w xml. Próbowałem usunąć wszystkie widoki i ich użycie, które LeakCanary zgłosiło jako nieszczelne. Kiedy powiedziano, że przeciek TextView
, który jest po prostu używany do wpisania tekstu onViewCreated
i nie jest używany nigdzie indziej, przecieka, zacząłem wątpić, czy w moim kodzie jest problem.
Analizowałem wywołania metod cyklu życia we fragmentach i zauważyłem, że kiedy przechodzę do nowego ekranu poprzedniego fragmentu, wszystkie metody onDestroyView
są wywoływane, ale nie są wywoływane onDestroy
. Kiedy klikam wstecz, onDestroy
wywoływany jest fragment, który był na wierzchu stosu, a zachowane wystąpienia licznika zmniejszają się.
Podejrzewam, że komponent Nawigacji zachowuje instancję fragmentu, gdy znajduje się w tylnym stosie, a LeakCanary postrzega go jako wyciek.
onDestroyView
Powiązaniu View.