13 Stimmen

Können Honeycomb Loader Probleme mit AsyncTask + UI Update lösen?

Etwas im Hintergrund zu tun und dann die Benutzeroberfläche zu aktualisieren, ist in Android sehr schwer korrekt zu implementieren. Es ist einfach schlecht konzipiert. Ein typisches Beispiel ist eine AsyncTask, die etwas aus dem Web abruft und das Ergebnis anzeigt. Dabei gibt es 2 Probleme:

  1. Die AsyncTask hat einen Verweis auf Activity (weil sie ihre Benutzeroberfläche aktualisieren muss). Nach der Änderung der Bildschirmausrichtung wird die Activity neu gestartet. Aber die AsyncTask verweist immer noch auf die alte zerstörte Activity und kann daher die Benutzeroberfläche der neuen Activity nicht aktualisieren.

  2. Dies kann zu OutOfMemoryException führen. Stellen Sie sich vor, Sie haben eine Activity mit vielen Bitmaps und starten eine AsyncTask. Sie drücken BACK (Activity ist beendet), aber die AsyncTask läuft noch und da sie auf die Activity verweist, ist die Activity mit den Bitmaps noch im Speicher. Wiederholen Sie dies (Activity starten und BACK) und Sie haben früher oder später ein Force Close.

Dieses Problem kann gelöst werden, ist aber viel zu kompliziert. In einer Activity habe ich 3 verschiedene AsyncTasks, von denen jede in mehreren Instanzen gleichzeitig laufen kann. Dies korrekt zu implementieren ist frustrierend. Der Code wird wirklich schwer zu verstehen und zu debuggen.

Dose Wabenlader das Problem irgendwie lösen? Und gibt es eine Möglichkeit, sie in Vor-Honeycomb Android-Versionen zu verwenden?

7voto

alexanderblom Punkte 8612

Ja, nach meiner Erfahrung mit Loader sie scheinen die häufigsten Probleme zu lösen, die Menschen mit AsyncTasks und Konfigurationsänderungen.

Ich glaube, Google sagte, dass die statische Bibliothek der Fragmente Folgendes enthalten würde Loaders also ja, sie sollten auch rückwärts funktionieren, wenn die Bibliothek veröffentlicht wird.

4voto

Mike dg Punkte 4568

Dies beantwortet zwar nicht Ihre Frage zu Honeycomb-Loadern, aber der folgende Link enthält ein Muster, das Orientierungsänderungen für AsyncTasks leicht handhabt.

http://evancharlton.com/thoughts/rotating-async-tasks/

Dort gibt es auch einige andere tolle Beiträge.

更新しました。 Wie OP in den Kommentaren angemerkt hat, funktioniert dies nur bei Konfigurationsänderungen (Ausrichtung), aber nicht bei Verwendung der BACK-Taste und Neustart über das Home-Menü oder die Aufgabenliste.

Wenn Sie jeweils nur eine AsyncTask benötigen, können Sie einen statischen Verweis auf AsyncTask innerhalb der Activity verwenden. Die andere Möglichkeit wäre, den Verweis auf Application zu speichern.

Wenn dann eine neue Activity gestartet wird, wird geprüft, ob eine AsyncTask läuft und sich selbst als aktuelle Activity festgelegt (über einen Setter auf AsyncTask). Achten Sie darauf, den Zugriff auf die Activity innerhalb von AsyncTask zu synchronisieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X