Warum sollte AsyncTaskLoader anstelle des einfachen Handlers mit LoaderManager verwendet werden?

8

Das Ausführen von asynchronen Aufgaben aus dem UI-Thread und das Ändern der Benutzeroberfläche ist ein häufiges Problem in der Android-Entwicklung. Daher entschied ich mich, etwas Zeit mit verschiedenen Techniken zu verbringen und zu erforschen, was für mich am besten funktioniert.

>

Was ich für wichtig hielt:

  • Sollte zuverlässig funktionieren
  • Code Lesbarkeit
  • Activity oder Fragment sollten so weit wie möglich von der Thread-Verwaltung entfernt werden

Hier ist die Zusammenfassung meiner Eindrücke (die falsch sein können und einige sind nur Meinungen) über die verschiedenen Methoden:

AsyncTask

Ich habe einfach AsyncTask ohne LoaderManager verwendet, als ich das erste Mal in Android war:

  • Hatte zeitweise Probleme, ich schrieb meine eigene AsyncTaskManager , um sie mit dem Aktivitätslebenszyklus zu verwalten.
  • Es gibt einige Einschränkungen für die Anzahl der Aufgaben und Speicherverluste wurden bereits gemeldet.
  • Das größte Problem bei diesen war, dass sie meinen Code extrem verworren machten und die Vereinfachung des Codes den Zweck der Verwendung von Code zunichte machte.

AsyncTaskLoader mit LoaderManager

Dies scheint der empfohlene Weg zu sein, dies zu tun, also habe ich es ein wenig erforscht:

  • Nachdem wir diese ein wenig gelesen haben, scheint es der Hauptgrund, warum diese Methode empfohlen wird, weil sie die Aufgaben mit dem Fragment -Lebenszyklus verwaltet, und von meinem Verständnis aus startet sie die Aufgaben einfach neu, wenn nötig. Es scheint nicht möglich zu sein, die Ergebnisse einer Aufgabe zu erhalten, die vor dem Neustart einer Aktivität nach dem Neustart der Aktivität gestartet wurde.
  • Alle Aufgabenparameter scheinen Parcelable oder Serialiazable zu sein, um in ein Bundle Objekt zu gelangen.

Handler, Threads, mit Nachrichten

Auf diese Methode habe ich mich festgelegt:

  • Einfach zu implementieren, extrem anpassbar.
  • Sie erhalten Zugriff auf den Thread, der die Aufgabe ausführt: setzen Sie die Priorität, setzen Sie den Thread-Namen für das Debugging, setzen Sie den Daemon und so weiter.
  • Scheint viel reaktionsschneller als bei der Verwendung von AsyncTasks, basierend auf einem Sehtest, bei dem ich oft auf eine Schaltfläche klicke und beobachte, wie die Ergebnisse und Threads aufblitzen;) Ich könnte dies vergleichen.
  • Um mit Lebenszyklusproblemen umzugehen, kann eine Singleton-Klasse geschrieben werden, die Nachrichten verwaltet (bleibt bestehen, solange der Prozess läuft). Speichert sie, wenn der Handler einer bestimmten Aktivität nicht eingerichtet ist, und leitet sie an den Aktivitätshandler weiter, wenn er nach den verpassten Nachrichten fragt. Das bedeutet, dass eine Aufgabe nicht mit den gleichen Parametern neu gestartet werden muss, was für Aufgaben, die nicht idempotent sind, kritisch sein kann.

Ich kam also zu der Schlussfolgerung, dass die Verwendung von Handler , Threads und Messages eine viel bessere Lösung ist, aber ich bin überzeugt, dass ich etwas vermisse, weil ich fast überall die Empfehlung sah, die AsyncTaskLoader Methode. Was vermisse ich?

Danke für die Eingabe.

    
Emil Davtyan 29.10.2012, 07:00
quelle

2 Antworten

7

Was Sie vermissen ist, dass Klassen wie AsyncTask und LoaderManager mit Android geschrieben wurden. Das heißt, das Betriebssystem wurde entwickelt, um im Vergleich zu einem Desktop-Computer minimalste Hardware zu nutzen. AsyncTask begrenzt den Thread-Pool, da Sie wesentlich strengere Thread-Einschränkungen haben als auf anderen Systemen. Wenn Sie versuchen, mehr als 100 Threads zu generieren, werden neue Threads zurückgewiesen oder das System wird abgestürzt. Sie können sicherlich Thread und Handler verwenden, aber Sie sind allein damit fertig, es zu verwalten.

Zuletzt habe ich gehört, dass AsyncTask 10 Threads mit einer Warteschlangentiefe von 10 Tasks unterstützt (in späteren Versionen möglicherweise erhöht). Wenn dies einschränkend ist, können Sie immer die Quelle abrufen und Ihre eigene schreiben. Ich habe es schon einmal gemacht. Die wichtige Sache, die Sie in Betracht ziehen, ist, kann ich in Schwierigkeiten unten die Straße mit dem Laichen zu vielen Fäden laufen, und wenn ja, wie werde ich damit umgehen.

Um Ihre Frage zu beantworten, warum es empfohlen wird, LoaderManager und AsyncTaskLoader zu verwenden, ist dies nur eine Annehmlichkeit. Es ist eine einfache Möglichkeit, Daten neu zu laden und in die Teile des Codes zu übertragen, die von diesen Daten abhängig sind. Es ist nicht in jeder Situation gerechtfertigt.

    
Jason Robinson 29.10.2012 07:40
quelle
4

Handler , Threads und Messages sind Low-Level-Klassen. Das gibt Ihnen Flexibilität - Sie können sie beliebig kombinieren, um Ihr spezielles Problem zu lösen. Sie müssen jedoch auch eine Menge Low-Level-Aufgaben erledigen: Anhalten / Starten von Threads, Weiterleiten an den richtigen Thread, Speichern / Wiederherstellen oder Neuerstellen von Instanzen, wenn Aktivitäten neu erstellt werden usw.

>

Loader erledigen das meiste für Sie und sind so konzipiert, dass sie ein bestimmtes Problem gut lösen können - das Laden von Daten in einer Aktivität. Das größte Plus ist, dass die Activity (oder FragmentActivity ) sich um die Verwaltung und den Neustart Ihrer Loader kümmert, wenn die Aktivität neu erstellt wird (was recht schwierig ist, ohne undichte Stellen). Es speichert auch Daten, so dass Sie dies nicht selbst tun müssen. Das heißt, wenn Sie etwas etwas anderes tun möchten, könnte die Verwendung von Ladeprogrammen peinlich werden. Wenn Sie also mehr Flexibilität benötigen, berücksichtigen Sie AsyncTask . Wenn das nicht passt, gehen Sie eine Stufe tiefer und verwenden Sie Threads und Handler .

    
Nikolay Elenkov 29.10.2012 09:23
quelle