Ich habe Grundkenntnisse über Speicherlecks und deren Ursachen. Deshalb verstehe ich nicht, ob ich ein Problem in meinem Code habe oder ob es falsch positiv ist. Ich weiß nicht, welchen Teil des Codes ich teilen soll, da das Projekt nicht klein ist. Aber lassen Sie es mich einfach in den Kommentaren wissen und ich werde den erforderlichen Code hinzufügen.
Ich benutze die Navigationsbogenkomponente und folge dem MVVM-Muster. Ich habe die LeakCanary-Bibliothek später in der Projektentwicklung hinzugefügt und sofort Warnungen vor beibehaltenen Instanzen erhalten, wenn ich zwischen Bildschirmen navigiere.
Das Problem tritt auf, wenn ich dem Backstack Fragmente hinzufüge. Mit jedem hinzugefügten Fragment zum Backstack erhöht sich der Zähler der beibehaltenen Instanzen. Wenn der Schwellenwert von 5 erreicht ist, gibt LeakCanary den Heap aus und gibt einen Bericht aus.
Wenn ich jedoch auf die Schaltfläche "Zurück" klicke und zu den vorherigen Bildschirmen zurückkehre, verringert sich der Zähler der beibehaltenen Instanzen, und wenn ich zum ersten Bildschirm zurückkehre, verschwinden schließlich alle beibehaltenen Instanzen.
Wenn ich mir Heap-Analyseberichte ansehe, heißt es, dass die Variable KoordinatorLayout, die auf die CoordinatorLayout
XML-Datei verweist, durchgesickert ist. Wenn ich die Variable und ihre gesamte Verwendung entferne und die App erneut ausführe, sehe ich dasselbe Problem, aber jetzt mit einer anderen Variablen, die auf eine andere Ansicht in XML verweist. Ich habe versucht, alle Ansichten und deren Verwendung zu entfernen, die LeakCanary als undicht gemeldet hat. Als es hieß, dass a TextView
, das nur zum Einfügen eines Textes onViewCreated
verwendet wird und nirgendwo anders verwendet wird, undicht ist, begann ich zu bezweifeln, dass es ein Problem in meinem Code gibt.
Ich habe die Aufrufe der Lebenszyklusmethode in Fragmenten analysiert und festgestellt, dass beim Navigieren zum neuen Bildschirm für das vorherige Fragment alle Methoden bis einschließlich onDestroyView
aufgerufen werden, jedoch nicht onDestroy
. Wenn ich zurückklicke, onDestroy
wird für Fragment aufgerufen, das sich oben auf dem Backstack befand und der Zähler für beibehaltene Instanzen abnimmt.
Ich vermute, dass die Navigationskomponente die Instanz eines Fragments behält, wenn es sich im Backstack befindet, und LeakCanary es als Leck ansieht.
onDestroyView
mit View Binding automatisch auf Null gesetzt wird .