2010-11-18 10 views
10

Wenn ich diese article korrekt interpretieren, ist die Weitergabe des Aktivitätskontexts an AsyncTasks ein potenzielles Leck, da die Aktivität möglicherweise zerstört wird, während die Aufgabe noch ausgeführt wird.Android Kontext Lecks in AsyncTask

Wie gehen Sie damit in AsyncTasks um, die keine inneren Klassen sind und Zugriff auf Ressourcen benötigen oder die UI aktualisieren?

Wie können Sie außerdem vermeiden, dass der Kontext verloren geht, wenn Sie Verweise auf Fortschrittsdialoge benötigen, um sie zu schließen?

+0

Schauen Sie sich [this] an (http://stackoverflow.com/questions/3821423/background-task-progress-dialog-orientation-change-is-there-any-100-working/3821998#3821998). Es geht um Orientierungsänderungen, aber es geht darum, einen Bezug zu einer Aktivität/einem Kontext sicher zu behalten. –

Antwort

11

Wenn ich Ihre Frage richtig verstehe: Java WeakReference oder SoftReference-Klasse ist eine gute Lösung für diese Art von Situation. Sie können den Kontext an die AsyncTask übergeben, ohne zu verhindern, dass der GC den Kontext bei Bedarf freigibt.

Der GC ist beim Sammeln von WeakReferences eifriger als beim Sammeln von SoftReferences.

statt:

FooTask myFooTask = new FooTask(myContext); 

Ihr Code würde wie folgt aussehen:

WeakReference<MyContextClass> myWeakContext = new WeakReference<MyContextClass>(myContext); 
FooTask myFooTask = new FooTask(myWeakContext); 

und im AsyncTask statt:

myContext.someMethod(); 

Ihr Code würde wie folgt aussehen:

myWeakContext.get().someMethod(); 
+4

nur sicherstellen, dass myWeakContext.get() nicht null zurückgibt, sonst schraubten Sie. –

+0

Dies funktioniert, wenn Sie die UI-Aktualisierungen nicht unbedingt nach Abschluss der Aufgabe durchführen müssen. Wenn die Ergebnisse der asynchronen Aufgabe nach dem Erstellen der Aktivität benötigt werden, müssen Sie einen anderen Ansatz verwenden. Kopflose Fragmente, die den Status beibehalten, können Ihre Aufgaben verwalten. – r1k0