Es ist eine sehr gute Frage, es braucht Zeit als Android-Programmierer, um das Problem vollständig zu verstehen. In der Tat haben AsyncTask zwei Hauptprobleme, die miteinander zusammenhängen:
- Sie sind schlecht an den Aktivitätslebenszyklus gebunden
- Sie verursachen sehr leicht Speicherlecks.
In der RoboSpice Motivations-App ( verfügbar bei Google Play ) beantworten wir diese Frage ausführlich. Es bietet einen detaillierten Überblick über AsyncTasks, Loader, deren Funktionen und Nachteile und stellt Ihnen eine alternative Lösung für Netzwerkanforderungen vor: RoboSpice. Netzwerkanforderungen sind eine häufige Anforderung in Android und werden von Natur aus lange ausgeführt. Hier ist ein Auszug aus der App:
Der Lebenszyklus von AsyncTask und Aktivität
AsyncTasks folgen nicht dem Lebenszyklus von Aktivitätsinstanzen. Wenn Sie eine AsyncTask innerhalb einer Aktivität starten und das Gerät drehen, wird die Aktivität zerstört und eine neue Instanz erstellt. Aber die AsyncTask wird nicht sterben. Es wird weiterleben, bis es fertig ist.
Wenn dies abgeschlossen ist, aktualisiert die AsyncTask die Benutzeroberfläche der neuen Aktivität nicht. In der Tat wird die frühere Instanz der Aktivität aktualisiert, die nicht mehr angezeigt wird. Dies kann zu einer Ausnahme vom Typ java.lang.IllegalArgumentException führen: Ansicht, die nicht an den Fenstermanager angehängt ist, wenn Sie beispielsweise findViewById verwenden, um eine Ansicht innerhalb der Aktivität abzurufen.
Speicherverlust Problem
Es ist sehr praktisch, AsyncTasks als innere Klassen Ihrer Aktivitäten zu erstellen. Da die AsyncTask die Ansichten der Aktivität bearbeiten muss, wenn die Aufgabe abgeschlossen ist oder ausgeführt wird, erscheint die Verwendung einer inneren Klasse der Aktivität praktisch: Innere Klassen können direkt auf jedes Feld der äußeren Klasse zugreifen.
Dies bedeutet jedoch, dass die innere Klasse einen unsichtbaren Verweis auf ihre äußere Klasseninstanz enthält: die Aktivität.
Auf lange Sicht führt dies zu einem Speicherverlust: Wenn die AsyncTask lange anhält, bleibt die Aktivität "am Leben", während Android sie gerne entfernen möchte, da sie nicht mehr angezeigt werden kann. Die Aktivität kann nicht durch Müll gesammelt werden. Dies ist ein zentraler Mechanismus für Android, um Ressourcen auf dem Gerät zu schonen.
Es ist wirklich eine sehr, sehr schlechte Idee, AsyncTasks für lange laufende Vorgänge zu verwenden. Trotzdem eignen sie sich gut für kurzlebige Personen wie das Aktualisieren einer Ansicht nach 1 oder 2 Sekunden.
Ich ermutige Sie, die herunterzuladen empfehle RoboSpice Motivations-App Sie erklärt dies ausführlich und bietet Beispiele und Demonstrationen der verschiedenen Möglichkeiten, einige Hintergrundoperationen durchzuführen.
doInBackground
den Bildschirm einfriert, wenn kein Fortschrittsbalken verwendet wird.