wake-up-neo.com

Unterschied zwischen AsyncTask und Thread/Runable

Ich habe eine Frage, die mich rätselt. 

Stellen Sie sich vor, ich möchte etwas in einem anderen Thread tun, z. B. GPS/Location-Sachen abrufen, die, wie in den SDK-Dokumenten empfohlen, einen Hintergrund-Thread verwenden müssen. 

Also hier ist die Frage: Was ist der Unterschied zwischen 

  1. Thread im Hintergrund über AsyncTaskUNDerstellen

  2. Thread thread1 = new Thread(new Runnable() ... erstellen und run() implementieren?

54
kevoroid

AsyncTask ist eine Convenience-Klasse für die Arbeit an einem neuen Thread und verwendet die Ergebnisse für den Thread, von dem er aufgerufen wurde (normalerweise der UI-Thread), wenn er fertig ist. Es handelt sich lediglich um einen Wrapper, der ein paar ausführbare Dateien verwendet, die jedoch alle Feinheiten beim Erstellen des Threads und beim Umgang mit Messaging zwischen den Threads beherrscht.

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 im UI-Thread, ohne Threads und/oder Handler bearbeiten zu müssen.

AsyncTask ist als Hilfsklasse für Thread und Handler konzipiert und bildet kein generisches Threading-Framework. AsyncTasks sollten idealerweise für kurze Operationen (höchstens einige Sekunden) verwendet werden. Wenn Sie Threads über einen längeren Zeitraum laufen lassen müssen, wird dringend empfohlen, die verschiedenen APIs des Java.util.concurrent-Pakets zu verwenden, wie z Executor, ThreadPoolExecutor und FutureTask.

Eine asynchrone Task wird durch eine Berechnung definiert, die in einem Hintergrundthread ausgeführt wird und deren Ergebnis im UI-Thread veröffentlicht wird. Eine asynchrone Task wird durch 3 generische Typen definiert, die als Params, Progress und Result bezeichnet werden, sowie 4 Schritte, die als onPreExecute, doInBackground, onProgressUpdate und onPostExecute bezeichnet werden.

Das Runnable Interface ist das Kernstück von Java-Threading. Die Runnable-Schnittstelle sollte von jeder Klasse implementiert werden, deren Instanzen von einem Thread ausgeführt werden sollen.

Auch wenn ich aus diesem Blog zitiere :

wenn Sie eine SIMPLE-Codierung benötigen, verwenden Sie AsyncTask und wenn Sie SPEED benötigen, den traditionellen Java-Thread.

43
NINCOMPOOP

Berücksichtigen Sie auch, dass Sie ab Android v4.04 nicht mehr als eine AsyncTasks gleichzeitig haben können, es sei denn, Sie verlieren die Kompatibilität mit niedrigeren Versionen. Sei vorsichtig! 

2
Lorenzo

Hauptunterschiede:

  1. AsyncTask ist eine asynchrone Task, die durch eine Berechnung definiert wird, die in einem Hintergrundthread ausgeführt wird und deren Ergebnis im UI-Thread veröffentlicht wird. Mit normalem Thread ist dies nicht möglich, es sei denn, Sie verwenden Handler für UI-Thread und veröffentlichen eine Nachricht OR, um das Attribut eines Objekts direkt zu ändern, indem Sie die richtige Synchronisierung implementieren.

  2. Wie vom Entwicklerhandbuch empfohlen, bezüglich Thread-Leistung

    Es gibt einige wichtige Leistungsaspekte, die zu beachten sind. Zunächst werden standardmäßig alle von ihr erstellten AsyncTask-Objekte von einer App in einen einzelnen Thread verschoben. Daher werden sie seriell ausgeführt, und wie beim Haupt-Thread kann ein besonders langes Arbeitspaket die Warteschlange blockieren. Aus diesem Grund empfehlen wir Ihnen, AsyncTask nur für die Bearbeitung von Arbeitselementen zu verwenden, die kürzer als 5 ms sind.

    Normales Thread kann jedoch für lange laufende Aufgaben verwendet werden. 

Einfache Java-Threads sind für Android nicht sehr nützlich, im Gegensatz zu HandlerThread , das vom Android-Framework bereitgestellt wurde. 

Praktische Klasse zum Starten eines neuen Threads mit einem Looper. Der Looper kann dann zum Erstellen von Handler-Klassen verwendet werden. Beachten Sie, dass start () noch aufgerufen werden muss.

Weitere Informationen finden Sie im folgenden Beitrag:

Handler vs AsyncTask vs Thread

2
Ravindra babu

Verwenden Sie den neuen Job Scheduler besser in der Support-Bibliothek.

0
user10754009

Ein offensichtlicher Nachteil für die AsyncTask-Klasse besteht darin, dass nach Android 3.0 asynchrone Aufgaben entsprechend der Reihenfolge der Startzeit ausgeführt werden. Das heißt, Tasks werden nacheinander ausgeführt, es sei denn, Sie führen den Task durch Aufruf von 'executeOnExecutor (Executors.newCachedThreadPool ())' aus. Diese Methode erstellt einen eigenen Thread-Pool. 

0
Stevens