Ho una conoscenza di base delle perdite di memoria e di cosa può causarle. Ecco perché non capisco se ho un problema nel mio codice o è un falso positivo. Non so quale parte del codice dovrei condividere poiché il progetto non è piccolo. Fammi sapere nei commenti e aggiungerò il codice richiesto.
Uso il componente dell'arco di navigazione e seguo il modello MVVM. Ho aggiunto la libreria LeakCanary più avanti nello sviluppo del progetto e ha iniziato immediatamente a darmi avvisi sulle istanze conservate quando navigo tra le schermate.
Il problema si verifica quando aggiungo frammenti allo stack posteriore. Con ogni frammento aggiunto allo stack posteriore aumenta il contatore delle istanze conservate. Quando raggiunge il valore di soglia di 5 LeakCanary scarica l'heap e fornisce il report.
Ma se faccio clic sul pulsante Indietro e torno alle schermate precedenti, il contatore delle istanze conservate diminuisce e alla fine, quando ritorna alla prima schermata, tutte le istanze conservate scompaiono.
Se guardo i rapporti di analisi dell'heap, si dice che CoordinatorLayout
è trapelato il variabile coordinatorLayout che è un riferimento a in xml. Se rimuovo la variabile e tutto il suo utilizzo ed eseguo nuovamente l'app vedo lo stesso problema, ma ora con un'altra variabile che è un riferimento a un'altra vista in XML. Ho provato a rimuovere tutte le visualizzazioni e il loro utilizzo che LeakCanary ha segnalato come perdite. Quando è stato detto che a TextView
, che è appena usato per inserire un testo onViewCreated
e non usato altrove, ho iniziato a dubitare che ci sia un problema nel mio codice.
Ho analizzato le chiamate del metodo del ciclo di vita in frammenti e ho notato che quando passo alla nuova schermata per il frammento precedente, tutti i metodi fino a includere onDestroyView
vengono chiamati ma non onDestroy
. Quando clicco indietro onDestroy
viene chiamato il frammento che si trovava sopra lo stack posteriore e il contatore delle istanze mantenute diminuisce.
Ho il sospetto che il componente di navigazione stia mantenendo l'istanza di un frammento quando è nello stack posteriore e LeakCanary lo vede come una perdita.
onDestroyView
con Visualizza rilegatura.