Ich bin verwirrt, wann man AsyncTask einem Handler vorziehen würde. Angenommen, ich möchte alle n Sekunden einen Code ausführen, der die Benutzeroberfläche aktualisiert. Warum sollte ich einen über den anderen wählen?
Ich bin verwirrt, wann man AsyncTask einem Handler vorziehen würde. Angenommen, ich möchte alle n Sekunden einen Code ausführen, der die Benutzeroberfläche aktualisiert. Warum sollte ich einen über den anderen wählen?
Antworten:
IMO, AsyncTask wurde geschrieben, um eine bequeme und benutzerfreundliche Möglichkeit zur Hintergrundverarbeitung in Android-Apps zu bieten, ohne sich über die Details auf niedriger Ebene (Threads, Nachrichtenschleifen usw.) Gedanken machen zu müssen. Es bietet Rückrufmethoden, mit denen Sie Aufgaben planen und die Benutzeroberfläche bei Bedarf problemlos aktualisieren können.
Es ist jedoch wichtig zu beachten, dass sich ein Entwickler bei der Verwendung von AsyncTask seinen Einschränkungen unterwirft, die sich aus den Entwurfsentscheidungen ergeben, die der Autor der Klasse getroffen hat. Zum Beispiel habe ich kürzlich herausgefunden, dass die Anzahl der Jobs, die mit AsyncTasks geplant werden können, begrenzt ist.
Handler ist transparenter von beiden und gibt Ihnen wahrscheinlich mehr Freiheit; Wenn Sie also mehr Kontrolle über die Dinge haben möchten, wählen Sie Handler, sonst funktioniert AsynTask einwandfrei.
AsyncTaskswerden sie auf einem Thread ausgeführt, also keine Parallelität mehr. Sie können sie weiterhin auf einer parallelen ExecutorImplementierung ausführen .
Meine Faustregel wäre:
Wenn Sie etwas Isoliertes in Bezug auf die Benutzeroberfläche tun, z. B. Daten herunterladen, um sie in einer Liste darzustellen, fahren Sie fort und verwenden Sie sie AsyncTask.
Wenn Sie mehrere wiederholte Aufgaben ausführen, z. B. mehrere Bilder ImageViewsherunterladen, die beim Herunterladen angezeigt werden sollen ( z. B. das Herunterladen von Miniaturansichten), verwenden Sie eine Aufgabenwarteschlange mit Handler.
Versuchen Sie immer, AsyncTask nach Möglichkeit zu vermeiden, hauptsächlich aus folgenden Gründen:
Es wird nicht garantiert, dass AsyncTask ausgeführt wird, da vom System eine ThreadPool-Basis und eine maximale Größe festgelegt werden. Wenn Sie zu viel Asynctask erstellen, werden diese möglicherweise zerstört
AsyncTask kann abhängig vom Aktivitätslebenszyklus automatisch beendet werden, auch wenn es ausgeführt wird, und Sie haben keine Kontrolle darüber
AsyncTask-Methoden, die auf dem UI-Thread ausgeführt werden, wie onPostExecute, können ausgeführt werden, wenn die Aktivität, auf die sie sich beziehen, nicht mehr sichtbar ist oder sich möglicherweise in einem anderen Layoutstatus befindet, wie nach einer Änderung der Ausrichtung.
Abschließend sollten Sie die UIThread-verknüpften Methoden von AsyncTask nicht verwenden, was der Hauptvorteil ist !!! Darüber hinaus sollten Sie nur unkritische Arbeiten an doInBackground ausführen. Lesen Sie diesen Thread, um weitere Einblicke in diese Probleme zu erhalten:
Ist AsyncTask wirklich konzeptionell fehlerhaft oder fehlt mir nur etwas?
Versuchen Sie abschließend, lieber IntentServices, HandlerThread oder ThreadPoolExecutor anstelle von AsyncTask zu verwenden, wenn eines der oben genannten Probleme ein Problem für Sie darstellt. Sicher, es wird mehr Arbeit erfordern, aber Ihre Anwendung wird sicherer sein.
Wenn Sie alle x Sekunden eine Berechnung durchführen möchten, sollten Sie wahrscheinlich Runnableeine Handler(mit postDelayed()) Runnableeinplanen, die im aktuellen UI-Thread beginnen sollte. Wenn Sie es in einem anderen Thread starten möchten, verwenden Sie HandlerThread. AsyncTask ist für uns einfacher zu verwenden, aber nicht besser als der Handler.
Der Handler ist dem Hauptthread der Anwendung zugeordnet. Es verarbeitet und plant Nachrichten und Runnables, die von Hintergrund-Threads an den App-Haupt-Thread gesendet werden.
AsyncTask bietet eine einfache Methode zum Behandeln von Hintergrundthreads, um die Benutzeroberfläche zu aktualisieren, ohne sie durch zeitaufwändige Vorgänge zu blockieren.
Die Antwort ist, dass beide verwendet werden können, um die Benutzeroberfläche von Hintergrund-Threads zu aktualisieren. Der Unterschied liegt in Ihrem Ausführungsszenario. Sie können den Handler verwenden, um verzögerte Nachrichten zu veröffentlichen oder Nachrichten in einer bestimmten Reihenfolge an die MessageQueue zu senden.
Sie können AsyncTask verwenden, wenn Sie auf einfache und bequeme Weise Parameter zwischen dem Hauptthread der App und dem Hintergrundthread austauschen (und damit die Benutzeroberfläche aktualisieren) möchten.
AsyncTasksetzt voraus, dass Sie etwas im UI-Thread tun, nachdem einige Hintergrundarbeiten abgeschlossen sind. Auch können Sie es nur einmal ausführen (nach diesem, seinen Status ist FINISHEDund Sie eine Ausnahme erhalten versuchen , es auszuführen einmal mehr). Auch die Flexibilität bei der Verwendung ist nicht viel. Ja, Sie können THREAD_POOL_EXECUTOReine parallele Ausführung verwenden, aber der Aufwand ist möglicherweise nicht wert.
Handlersetzt nichts voraus, außer Runnables und Messages zu behandeln. Es kann auch so oft ausgeführt werden, wie Sie möchten . Sie können frei entscheiden, an welchen Thread es angehängt werden soll, wie es mit anderen Handlern kommuniziert und möglicherweise mit ihnen produziert HandlerThread. Es ist also viel flexibler und für wiederholte Arbeiten geeignet.
Überprüfen Sie andere Art der HandlerBeispiele hier .
Sie sind die beste Interviewfrage, die gestellt wird. AsyncTask - Sie werden verwendet, um UI-Threads auszulagern und Aufgaben im Hintergrund auszuführen. Handler - Android Dosent haben eine direkte Kommunikation zwischen der Benutzeroberfläche und dem Hintergrund-Thread. Handler müssen zum Senden von Nachrichten verwendet werden oder über die Nachrichtenwarteschlange ausgeführt werden.
AsyncTasks werden daher verwendet, wenn Aufgaben im Hintergrund ausgeführt werden müssen und Handler für die Kommunikation zwischen einer Benutzeroberfläche und einem Hintergrundthread verwendet werden.
doInBackground - funktioniert grundsätzlich in einem anderen Thread. onPostExecute - veröffentlicht die Ergebnisse im UI-Thread und sendet intern eine Nachricht an den Handler des Hauptthreads. Dem Haupt-UI-Thread sind bereits ein Looper und ein Handler zugeordnet.
Wenn Sie also eine Hintergrundaufgabe ausführen müssen, verwenden Sie AsyncTask. Wenn jedoch etwas auf der Benutzeroberfläche aktualisiert werden muss, wird der Handler des Hauptthreads verwendet.