Foto di Bogomil Mihaylov su UnsplashRicevitori broadcast
I ricevitori broadcast possono essere usati per ascoltare eventi o intenti broadcast a livello di sistema che indicano informazioni sul dispositivo come batteria scarica, data e cambiamenti di connettività – per esempio che la modalità aereo è stata disattivata. Quando li usiamo, dobbiamo ricordarci di annullare la registrazione dei ricevitori broadcast, altrimenti inevitabilmente manterremo un riferimento all’attività.
Come evitarlo: Tutto quello che dovete fare è chiamare unregister()
sul vostro ricevitore broadcast in onStop()
nella vostra attività.
Questo pattern si trova anche per asyncTask, TimerTask e threads che devono essere cancellati in onDestroy()
per evitare una perdita.
Context to Singleton class
A volte abbiamo bisogno di passare il contesto da un’attività a una classe Singleton. Un esempio di questo potrebbe essere una classe utils dove abbiamo bisogno di accedere a risorse, servizi o file interni. Tuttavia, passare il contesto significa che inevitabilmente manteniamo un riferimento all’attività.
Come evitarlo: Invece di passare in this
da un’attività, possiamo passare nel contesto dell’applicazione se è disponibile (se volete saperne di più su quando usare quale contesto, ho trovato questo articolo molto utile!) Una soluzione alternativa è assicurarsi di impostare il contesto Singleton su null all’interno del metodo activity onDestroy()
.
Riferimenti statici
Riferire una vista o un’attività come statica significa che il riferimento all’attività non sarà garbage collect. Questo dovrebbe essere semplicemente evitato in ogni momento.
Come evitarlo: Se per qualche ragione dovete farlo, potete assicurarvi che venga distrutto impostandolo a null in onDestroy().
Riferimenti a classi interne
Le classi interne spesso causano perdite tenendo un riferimento implicito alla classe esterna. Questo accade se la variabile di classe è dichiarata come statica o se la classe stessa non è dichiarata come statica. Confusione? Sì, ma è facile da evitare se seguiamo la semplice regola seguente.
Come evitarlo: Rendere la classe interna statica per evitare di tenere un riferimento alla classe esterna e non creare mai una variabile statica di una classe interna. Lo stesso vale per le classi anonime.
Ecco! Spero che abbiate imparato qualcosa sui memory leak e su come evitarli. Buona codifica! 😄
Qui ci sono una serie di articoli e documentazione che ho trovato particolarmente utili per imparare i memory leaks: