In meinem Code wird eine Warnung angezeigt, die besagt:
Diese AsyncTask-Klasse sollte statisch sein, da sonst Lecks auftreten können (anonym android.os.AsyncTask)
Die vollständige Warnung lautet:
Diese AsyncTask-Klasse sollte statisch sein, da sonst Lecks auftreten können (anonym android.os.AsyncTask). Ein statisches Feld leckt Kontexte. Nicht statische innere Klassen haben einen impliziten Verweis auf ihre äußere Klasse. Wenn diese äußere Klasse beispielsweise ein Fragment oder eine Aktivität ist, bedeutet diese Referenz, dass der lang laufende Handler / Loader / Task einen Verweis auf die Aktivität enthält, der verhindert, dass Müll gesammelt wird. In ähnlicher Weise können direkte Feldverweise auf Aktivitäten und Fragmente dieser länger laufenden Instanzen zu Lecks führen. ViewModel-Klassen sollten niemals auf Ansichten oder Nichtanwendungskontexte verweisen.
Das ist mein Code:
new AsyncTask<Void,Void,Void>(){
@Override
protected Void doInBackground(Void... params) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.notifyDataSetChanged();
}
});
return null;
}
}.execute();
Wie korrigiere ich das?
myActivity.getApplication()
in den privaten Konstruktor für den Singleton, um RoomDB-Klassen und andere Klassen zu initialisieren). Meine ViewModels erhalten die Singleton-Instanz als private Referenz, um einige Operationen an der Datenbank auszuführen. Die ViewModels importieren also das Singleton-Paket sowie android.app.Application
eines davon sogar android.app.Activity
. Da "the Singleton" diese ViewModels nicht importieren muss, um zu funktionieren, können dennoch Speicherlecks auftreten?