Meine Aktivität versucht, einen AlertDialog zu erstellen, für den ein Kontext als Parameter erforderlich ist. Dies funktioniert wie erwartet, wenn ich Folgendes verwende:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
Ich bin jedoch misstrauisch, "dies" als Kontext zu verwenden, da möglicherweise Speicherlecks auftreten, wenn Aktivität zerstört und neu erstellt wird, selbst während einer einfachen Bildschirmdrehung. Aus einem verwandten Beitrag im Blog des Android-Entwicklers :
Es gibt zwei einfache Möglichkeiten, um kontextbezogene Speicherverluste zu vermeiden. Am naheliegendsten ist es, zu vermeiden, dass der Kontext außerhalb seines eigenen Bereichs entkommt. Das obige Beispiel zeigte den Fall einer statischen Referenz, aber innere Klassen und ihre implizite Referenz auf die äußere Klasse können ebenso gefährlich sein. Die zweite Lösung besteht darin, den Anwendungskontext zu verwenden. Dieser Kontext bleibt so lange bestehen, wie Ihre Anwendung aktiv ist, und hängt nicht vom Lebenszyklus der Aktivitäten ab. Wenn Sie langlebige Objekte behalten möchten, die einen Kontext benötigen, merken Sie sich das Anwendungsobjekt. Sie können es einfach erhalten, indem Sie Context.getApplicationContext () oder Activity.getApplication () aufrufen.
Aber für das AlertDialog()
weder getApplicationContext()
oder getApplication()
als Kontext akzeptabel, da es die Ausnahme auslöst:
"Fenster kann nicht hinzugefügt werden - Token null ist nicht für eine Anwendung geeignet"
gemäß Referenzen: 1 , 2 , 3 usw.
Sollte dies wirklich als "Fehler" angesehen werden, da uns offiziell empfohlen wird, ihn zu verwenden, Activity.getApplication()
und er dennoch nicht wie angekündigt funktioniert?
Jim