Warnung: Diese AsyncTask-Klasse sollte statisch sein oder es können Lecks auftreten
Bin ich immer eine Warnung in meinem code, die besagt:
This AsyncTask class should be static or leaks might occur (anonymous android.os.AsyncTask)
Das komplette Warnung:
This AsyncTask class should be static or leaks might occur (anonymous android.os.AsyncTask)
Ein statisches Feld wird Leck Kontexten. Nicht-statische innere Klassen haben eine implizite Referenz auf die äußere Klasse. Wenn das äußere Klasse ist zum Beispiel ein Fragment oder eine Tätigkeit, dann ist dieser Verweis bedeutet, dass die lang andauernde hf/loader/der Aufgabe einen Verweis auf die Aktivität, die verhindert, dass es immer Müll gesammelt. Ähnlich, direkte Referenzen zu den Aktivitäten und Fragmente aus diesen mehr ausgeführten Instanzen können zu Undichtigkeiten führen. ViewModel-Klassen sollten niemals zu Sichten oder nicht-Anwendung Zusammenhängen.
Dies 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 kann ich das korrigieren?
InformationsquelleAutor der Frage Keyur Nimavat | 2017-06-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht-statischen inneren Klasse einen Verweis auf die enthaltende Klasse. Wenn Sie erklären
AsyncTask
als innere Klasse, es könnte länger Leben als die mitActivity
Klasse. Dies ist wegen der implizite Verweis auf die enthaltende Klasse. Dies verhindert, dass die Aktivität aus dem Müll gesammelt, damit die Speicher-Leck.Um Ihr problem zu lösen, verwenden Sie entweder statisch geschachtelte Klasse statt anonymer, lokale und innere Klassen oder verwenden Sie top-level-Klasse.
InformationsquelleAutor der Antwort Anand
Wie die Verwendung einer statischen inneren AsyncTask-Klasse
Um Lecks zu verhindern, können Sie die innere Klasse statisch. Das problem mit, dass, obwohl, ist, dass Sie keinen Zugriff mehr auf die Aktivität der UI-Ansichten oder member-Variablen. Sie können übergeben Sie eine Referenz auf die
Context
aber dann führen Sie das gleiche Risiko ein Speicherleck. (Android können Sie nicht Müll sammeln, die Aktivität nach dem es schließt, wenn der AsyncTask-Klasse hat einen starken Bezug zur it.) Die Lösung ist, einen schwachen Verweis auf die Aktivität (oder was auch immerContext
Sie brauchen).Notes
AsyncTask
tutorials die es noch nicht mit ihm umgehen (siehe hierhierhierund hier).AsyncTask
waren eine Klasse der obersten Ebene. Eine statische innere Klasse ist im Grunde das gleiche wie eine top-level-Klasse in Java.Wenn Sie brauchen nicht die Aktivität selbst, aber immer noch wollen, dass der Kontext (z.B. Anzeige eines
Toast
), die Sie übergeben können, einen Verweis auf die app-Kontext. In diesem Fall ist derAsyncTask
Konstruktor könnte so Aussehen:InformationsquelleAutor der Antwort Suragch
Diese
AsyncTask
Klasse sollte statisch sein oder Lecks auftreten, weilActivity
zerstört wird,AsyncTask
(beidestatic
odernon-static
) noch läuftnon-static
(AsyncTask
) Klasse, es wird die Referenz auf die äußere Klasse (Activity
).Garbage Collected
release wird es. Wenn ein Objekt ist unbenutzt undGarbage Collected
kann nicht loslassen => Speicherverlust=> Wenn
AsyncTask
istnon-static
Activity
nicht loslassen, falls es zerstört => LeckLösung für das update-UI nach machen AsyncTask als statische Klasse ohne Leck
1) Verwenden Sie
WeakReference
wie @Suragch Antwort2) Senden Sie und entfernen
Activity
Verweis auf (aus)AsyncTask
InformationsquelleAutor der Antwort Phan Van Linh