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:
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:
Ich habe einfach AsyncTask
ohne LoaderManager
verwendet, als ich das erste Mal in Android war:
AsyncTaskManager
, um sie mit dem Aktivitätslebenszyklus zu verwalten. Dies scheint der empfohlene Weg zu sein, dies zu tun, also habe ich es ein wenig erforscht:
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. Parcelable
oder Serialiazable
zu sein, um in ein Bundle
Objekt zu gelangen. Auf diese Methode habe ich mich festgelegt:
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.
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.
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
.
Tags und Links android multithreading android-asynctask android-handler android-ui