AsyncTaskLoader vs AsyncTask

129

Da Honeycombund das ist v4 Compatibility Libraryes möglich zu benutzen AsyncTaskLoader. Soweit ich weiß, AsyncTaskLoaderkann das durch Konfigurationsänderungen wie Bildschirmwechsel überleben.

Wird empfohlen, AsyncTaskLoaderanstelle von zu verwenden AsyncTask? Kommt LoaderManagerman auch ins Bild?

Aber ich habe keine guten Beispiele gefunden, wie man das richtig benutzt AsyncTaskLoader. Die Dokumente enthalten auch keine Beispiele. Kann jemand einige gute Beispiele liefern.

OKA
quelle

Antworten:

51

Weitere Informationen finden Sie im Quellcode der Kompatibilitätsbibliothek. Was ein FragmentActivitytut ist:

  • eine Liste von LoaderManager's führen
  • Stellen Sie sicher, dass sie nicht zerstört werden, wenn Sie Ihr Telefon umdrehen (oder eine andere Konfigurationsänderung auftritt), indem Sie Instanzen mit speichern onRetainNonConfigurationInstance()
  • Treten Sie den richtigen Lader, wenn Sie initLoader()Ihre Aktivität aufrufen

Sie müssen die LoaderManagerSchnittstelle mit den Loadern verwenden und die erforderlichen Rückrufe bereitstellen, um Ihre Loader zu erstellen und Ihre Ansichten mit den zurückgegebenen Daten zu füllen.

Im Allgemeinen sollte es einfacher sein, als sich AsyncTaskselbst zu verwalten. Ist AsyncTaskLoaderjedoch nicht genau gut dokumentiert, sollten Sie das Beispiel in den Dokumenten studieren und / oder Ihren Code nachbilden CursorLoader.

Nikolay Elenkov
quelle
5
Ich werde mir das ansehen. Vielleicht ist es zu früh, um gute Beispiele dafür zu finden AsyncTaskLoader, und wenn mehr Entwickler damit beginnen, werden weitere Beispiele folgen.
OKA
47

Wenn vergleichen AsyncTaskLoader vs. AsyncTask , wie Sie wissen, wenn Sie Ihr Gerät Bildschirm drehen, kann es zerstören und neu erstellen Sie Ihre Aktivitäten, um klarzustellen , let Bild das Gerät drehen , während die Vernetzung Transaktion los ist:

AsyncTask wird erneut als Hintergrundthread ausgeführt, und die vorherige Verarbeitung des Hintergrundthreads war nur redundant und zombie.

AsyncTaskLoader wird nur basierend auf der zuvor im Loader Manager registrierten Loader-ID wiederverwendet. Vermeiden Sie daher die erneute Ausführung von Netzwerktransaktionen.

Zusammenfassend lässt sich sagen, dass AsyncTaskLoader das Duplizieren von Hintergrundthreads verhindert und das Duplizieren von Zombie-Aktivitäten verhindert.

Hoang Duc Dong
quelle
11

AsyncTaskLoader hat dieselbe Funktion wie AsyncTask , ist jedoch etwas besser. Es kann Änderungen an der Aktivitätskonfiguration einfacher verarbeiten und verhält sich innerhalb der Lebenszyklen von Fragmenten und Aktivitäten. Das Schöne ist, dass der AsyncTaskLoader in jeder Situation verwendet werden kann, in der der AsyncTask verwendet wird. Immer wenn Daten in den Speicher geladen werden müssen, damit die Aktivität / das Fragment verarbeitet werden kann, kann der AsyncTaskLoader die Aufgabe besser erledigen.

Es gibt jedoch einige Probleme bei der Verwendung von AsyncTasks:

  • Konfigurationsänderungen können zu Problemen führen
  • Durch das Anhalten einer Aktivität wird die AsyncTask nicht angehalten
  • Eine ganze Menge Boilerplate-Code (was mehr mögliche Fehler bedeutet)

AsyncTaskLoader doc

Attif
quelle
8

Einige andere Unterschiede als in anderen Antworten beschrieben:

Bei Verwendung von AsyncTaskLoader über AsyncTask :

  • AsyncTaskLoader gibt uns die Freiheit, alte zwischengespeicherte Daten zu laden, bis neue Daten von zurückgegeben werdenforceLoad()

  • Wir können Verzögerungen einstellen AsyncTaskLoader von setUpdateThrottle()denen aufeinanderfolgende Updates auf Client verhindern kann (Aktivität / Fragment)

  • AsyncTaskLoader kann für mehrere Fragmente freigegeben werden, wenn sie eine gemeinsame übergeordnete Aktivität haben und von dort aus gestartet wurdegetActivity().getSupportLoaderManager()

  • AsyncTaskLoader wird zerstört, LoaderMangerwenn seine verknüpfte Aktivität nicht mehr verfügbar ist. während wir AsyncTasks manuell zerstören müssen, wenn die Aufruferaktivität zerstört wird. Dies spart uns Zeit beim Schreiben des gesamten Clearing-Materials. AsyncTaskLoader spielt gut mit ihren jeweiligen Lebenszyklen.

AsyncTaskLoader ist also viel besser als AsyncTask.

Palak Darji
quelle