Sichere Verwendung innerer Klassen innerhalb von Aktivitäten:
Innere Klassen können ein Speicherverlustrisiko darstellen, wenn ihre Lebensdauer über die ihrer Containerklasse (Aktivität) hinausgeht ) in Android. Dies kann auftreten, wenn eine äußere Instanz auf innere Instanzen verweist, nachdem die äußere Klasse zerstört oder neu erstellt wurde.
Beispiel 1 (sicher):
In diesem Beispiel die anonyme Die innere Klasse wird im Rahmen der Methode definiert und verwaltet keinen langlebigen Verweis auf die Aktivität. Daher ist es auslaufsicher:
final Dialog dialog = new Dialog(this);
// ...
dialog.show();
Nach dem Login kopieren
Beispiel 2 (Gefährlich):
Dieses Beispiel verwendet eine anonyme innere Klasse für ein Runnable, das mit einem Handler ausgeführt wird. Da das Runnable auf ein Feld der Aktivität verweist, kann es die Aktivität überleben und einen Verweis darauf aufrechterhalten, was zu einem Speicherverlust führt:
_handlerToDelayDroidMove = new Handler();
_handlerToDelayDroidMove.postDelayed(_droidPlayRunnable, 10000);
// ...
private Runnable _droidPlayRunnable = new Runnable() {
public void run() {
_someFieldOfTheActivity.performLongCalculation();
}
};
Nach dem Login kopieren
Wann können innere Klassen äußere Klassen überleben?
Innere Klassen können ihre äußeren Klassen überleben, wenn:
- Die innere Klasse wird von externen Objekten oder Komponenten referenziert, wodurch die äußere Instanz indirekt am Leben bleibt.
- Die Die innere Klasse wird außerhalb der umschließenden Klasse deklariert und verweist manuell auf die umschließende Klasse.
- Änderungen im Anwendungslebenszyklus (z. B. Bildschirmrotation) zerstören die äußere Klasse, während die innere Klasse intakt bleibt.
Aktivitäts- und Ansichtslecks:
- Aktivitäten behalten langlebige Verweise auf alle ihre Ansichten bei.
- Innere Klassen innerhalb von Ansichten oder Aktivitäten können Aktivitäten behalten oder Instanzen lebendig anzeigen, auch nachdem sie zerstört oder neu erstellt wurden.
- Um diese Art von Leck zu vermeiden, müssen Referenzen sorgfältig verwaltet und wann immer möglich statische innere Klassen oder Factory-Methoden verwendet werden.
Ausführbare Lecks:
- Ausführbare Klassen können mithilfe anonymer innerer Klassen implementiert werden, die sich auf Aktivitäts- oder Ansichtsinstanzen beziehen können.
- Um dieses Risiko zu mindern, sollten Sie die Verwendung von statischen Klassen in Betracht ziehen Stattdessen Runnables oder AsyncTask, die standardmäßig von der VM verwaltet werden.
Best Practices:
- Vermeiden Sie das Speichern von Verweisen auf Aktivitäts- oder Ansichtsinstanzen in langlebige Objekte.
- Verwenden Sie statische innere Klassen oder Factory-Methoden, um innere Klassen zu erstellen, die Zugriff auf umschließende Klassenmitglieder benötigen.
- Vermeiden Sie anonyme innere Klassen für Runnables, die auf Aktivitäts- oder Ansichtsinstanzen verweisen.
- Verwenden Sie den Anwendungskontext anstelle des Aktivitätskontexts für Referenzen, die die Lebensdauer der Aktivität überdauern müssen.
Das obige ist der detaillierte Inhalt vonWie kann ich Speicherlecks verhindern, wenn ich innere Klassen in Android-Aktivitäten verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!