Asynctask vs Thread in Android

135

In der Benutzeroberfläche habe ich für einige Hintergrundarbeiten eine separate verwendet Thread. Aber wie von anderen vorgeschlagen, benutze ich jetzt AsyncTask.

Was ist der Hauptunterschied zwischen a Threadund an AsyncTask?

In welchem ​​Szenario sollte ich ein Threadoder ein verwenden AsyncTask?

RAM
quelle
@ webaldo.at Ich habe dies wiederholt, hier haben sie die Beschreibung und den Unterschied zwischen Asynctask und Thread eingegeben. Ich möchte wissen, welcher Fall zum Beispiel Netzwerkverbindung, Datei gelesen für das, was ich verwende?.
Ram
Verkürzt: Thread -> Kein Zugriff auf den UI-Thread || Asynctask -> Bedingter Zugriff auf den UI-Thread
JavaDM
für die Hintergrundaufgabe ist IntentService eine weitere nette Option.
Chen
1
Mögliches Duplikat von Handler vs AsyncTask vs Thread
Ciro Santilli 法轮功 冠状 病. 事件 法轮功

Antworten:

146

Für lang laufende oder CPU-intensive Aufgaben gibt es grundsätzlich zwei Möglichkeiten: Java-Threads und die native AsyncTask von Android.

Keiner ist notwendigerweise besser als der andere, aber es ist wichtig zu wissen, wann jeder Anruf verwendet werden muss, um die Leistung des Systems zu Ihrem Vorteil zu nutzen.

Verwenden Sie AsyncTask für:

  1. Einfache Netzwerkoperationen, bei denen nicht viele Daten heruntergeladen werden müssen
  2. Festplattengebundene Aufgaben, die länger als ein paar Millisekunden dauern können

Verwenden Sie Java-Threads für:

  1. Netzwerkbetrieb mit mäßigen bis großen Datenmengen (entweder Hochladen oder Herunterladen)
  2. Aufgaben mit hoher CPU-Auslastung, die im Hintergrund ausgeführt werden müssen
  3. Jede Aufgabe, bei der Sie die CPU-Auslastung relativ zum GUI-Thread steuern möchten

Und es gibt viele gute Ressourcen über das Internet, die Ihnen helfen können:

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html

Mohit
quelle
Darf ich fragen, warum die Download-Datenmenge ein Problem darstellt?
Yeung
1
@Yeung Sie brauchen anscheinend einen Einblick in Async Task! Schauen Sie, größer die Datenmenge, dann deutlich größer die Zeit, die benötigt wird, um den gleichen Vorgang abzuschließen. Aus folgenden Gründen ist es nicht empfehlenswert, mit Async Task einen Prozess mit langer Laufzeit durchzuführen: 1. Async Task ist schlecht an den Aktivitätslebenszyklus gebunden. 2. Sie verursachen Speicherlecks.
Mohit
3
Schauen Sie sich das an: stackoverflow.com/questions/12797550/…
Mohit
Danke dir. Ich verstehe jetzt das Risiko.
Yeung
@Impasse @Yeung IMO Datenmenge ist kein Problem, das Hauptproblem bei den Netzwerkoperationen ist es die Zeit der Operation. Selbst das Herunterladen einiger Bytes kann lange dauern, wenn der Server ausgelastet, nicht erreichbar (Timeout) usw. ist. Eine Lösung könnte darin bestehen, sie AsyncTaskmit einem eigenen Scheduler zu verwenden.
Xmedeko
44

Wenn Sie Java-Threads verwenden, müssen Sie die folgenden Anforderungen in Ihrem eigenen Code erfüllen:

Synchronisation mit dem Hauptthread, wenn Sie Ergebnisse an die Benutzeroberfläche zurücksenden

Keine Standardeinstellung zum Abbrechen des Threads

Kein Standard-Thread-Pooling

Keine Standardeinstellung für die Behandlung von Konfigurationsänderungen in Android

Tarun Varshney
quelle
3
Dies ist eigentlich aufschlussreicher, weil es Gründe angeht, warum man keine einfachen Threads verwendet. Meiner Meinung nach sollte alles, was mit dem Aktivitäts- / Servicelebenszyklus verknüpft werden muss, stattdessen AsyncTask verwenden, auch wenn Sie die Ressourcen innerhalb der Aufgabe manuell "ordnungsgemäß abbauen" müssen, zumindest bleibt die Aufgabe nicht hängen wenn Aktivität getötet wird.
LeRobot
28

Faden

  • Lange Aufgabe im Allgemeinen
  • Aufruf mit der Methode thread.start ()
  • Wird von einem beliebigen Thread ausgelöst
  • Läuft auf einem eigenen Thread
  • Manuelle Thread-Verwaltung / Code kann schwer lesbar werden

AsyncTask

  • Kleine Aufgabe , die mit dem Haupt-Thread kommunizieren muss
  • Mit der Methode excute () aufrufen
  • Vom Hauptfaden ausgelöst
  • Läuft auf Worker-Thread
  • Muss ausgeführt und aus dem Hauptthread erstellt werden
Umang Kothari
quelle
11

Faden

Ein Thread ist eine gleichzeitige Ausführungseinheit. Es hat einen eigenen Aufrufstapel. Es gibt zwei Methoden, um Threads in Anwendungen zu implementieren.

Eine davon ist die Bereitstellung einer neuen Klasse, die Thread erweitert und die run () -Methode überschreibt. Die andere besteht darin, einer neuen Thread-Instanz während ihrer Erstellung ein ausführbares Objekt bereitzustellen. Ein Thread kann durch Aufrufen seiner "start" -Methode ausgeführt werden. Sie können die "Priorität" eines Threads festlegen, indem Sie dessen Methode "setPriority (int)" aufrufen.

Ein Thread kann verwendet werden, wenn Sie keine Auswirkungen auf den UI-Teil haben. Sie rufen beispielsweise einen Webdienst auf oder laden einige Daten herunter, und nach dem Herunterladen zeigen Sie sie auf Ihrem Bildschirm an. Dann müssen Sie einen Handler mit einem Thread verwenden. Dadurch wird Ihre Anwendung kompliziert, um alle Antworten von Threads zu verarbeiten.

Mit einem Handler können Sie Nachrichten- und ausführbare Objekte senden und verarbeiten, die der MessageQueue eines Threads zugeordnet sind. Jeder Thread hat jede Nachrichtenwarteschlange. (Wie eine Aufgabenliste), und der Thread nimmt jede Nachricht und verarbeitet sie, bis die Nachrichtenwarteschlange leer ist. Wenn der Handler kommuniziert, gibt er nur eine Nachricht an den Aufruferthread und wartet auf die Verarbeitung.

Wenn Sie Java-Threads verwenden, müssen Sie die folgenden Anforderungen in Ihrem eigenen Code erfüllen:

Synchronisierung mit dem Hauptthread, wenn Sie Ergebnisse an die Benutzeroberfläche zurücksenden. Kein Standard für das Abbrechen des Threads. Kein Standard-Thread-Pooling. Kein Standard für die Behandlung von Konfigurationsänderungen in Android

AsyncTask

AsyncTask ermöglicht die ordnungsgemäße und einfache Verwendung des UI-Threads. Diese Klasse ermöglicht das Ausführen von Hintergrundoperationen und das Veröffentlichen von Ergebnissen auf dem UI-Thread, ohne dass Threads und / oder Handler bearbeitet werden müssen. Eine asynchrone Aufgabe wird durch eine Berechnung definiert, die auf einem Hintergrundthread ausgeführt wird und deren Ergebnis im UI-Thread veröffentlicht wird.

AsyncTask durchläuft die folgenden 4 Phasen:

onPreExecute ()

Wird im UI-Thread aufgerufen, bevor die Aufgabe ausgeführt wird

doInbackground (Params ..)

Wird im Hintergrundthread unmittelbar nach Abschluss der Ausführung von onPreExecute () aufgerufen.

onProgressUpdate (Fortschritt ..)

Wird im UI-Thread nach einem Aufruf von PublishProgress (Progress ...) aufgerufen.

onPostExecute (Ergebnis)

Wird im UI-Thread aufgerufen, nachdem die Hintergrundberechnung abgeschlossen ist.

Warum sollten Sie AsyncTask verwenden?

Einfach für einen UI-Thread zu verwenden. (Verwenden Sie es also, wenn der Aufruferthread ein UI-Thread ist.)

Handler müssen nicht manipuliert werden.

Weitere Informationen finden Sie hier

Vipul Purohit
quelle
2

Faden:

Threadsollte verwendet werden, um lang laufende Vorgänge vom Hauptthread zu trennen, damit die Leistung verbessert wird. Aber es kann nicht elegant abgebrochen werden und es kann keine Konfigurationsänderungen von Android verarbeiten. Sie können die Benutzeroberfläche nicht von aktualisieren Thread.

AsyncTaskkann verwendet werden, um Arbeitselemente mit einer Dauer von weniger als 5 ms zu bearbeiten. Mit AsyncTaskkönnen Sie die Benutzeroberfläche im Gegensatz zu Java aktualisieren Thread. Viele lang laufende Aufgaben beeinträchtigen jedoch die Leistung.

Sie haben nur noch wenige Alternativen zu beiden.

HandlerThread / Handler und ThreadPoolExecutor

Weitere Informationen finden Sie im folgenden Beitrag:

Handler vs AsyncTask vs Thread

Ravindra Babu
quelle