Unterschied zwischen Service, Async Task & Thread?

147

Was ist der Unterschied zwischen Service, Async Task & Thread? Wenn ich mich nicht irre, werden alle verwendet, um einige Dinge im Hintergrund zu tun. Wie kann man also entscheiden, welche wann verwendet werden soll?

SpunkerBaba
quelle
Es scheint, dass es noch eine Sache gibt, mit der Menschen oft verwechselt werden können - Lader . In Verbindung stehender Thread - Asynctask vs Thread vs Services vs Loader
RBT

Antworten:

186

Wahrscheinlich haben Sie die Beschreibung der Dokumentation bereits gelesen. Ich werde sie nicht wiederholen. Stattdessen werde ich versuchen, mit meinen eigenen Worten zu antworten. Ich hoffe, sie helfen Ihnen.

  • Service ist wie eine Aktivität, hat aber keine Benutzeroberfläche. Wenn Sie beispielsweise das Wetter abrufen möchten, erstellen Sie wahrscheinlich keine leere Aktivität dafür. Dazu verwenden Sie einen Dienst.

  • Ein Thread ist ein Thread, wahrscheinlich kennen Sie ihn bereits aus einem anderen Teil. Sie müssen wissen, dass Sie die Benutzeroberfläche nicht über einen Thread aktualisieren können. Sie müssen hierfür einen Handler verwenden, aber lesen Sie weiter.

  • Eine AsyncTask ist ein intelligenter Thread, dessen Verwendung empfohlen wird. Intelligent, da es bei seinen Methoden helfen kann, und es gibt drei Methoden, die auf dem UI-Thread ausgeführt werden. Dies ist gut, um UI-Komponenten zu aktualisieren.

Ich verwende häufig Dienste und AsyncTasks. Thread weniger oder gar nicht, da ich mit AsyncTask fast alles machen kann.

Pentium10
quelle
1
Danke für Ihre Erklärung. Wenn ich also eine Anwendung erstellen muss, die Daten aus dem Web abruft, welche wäre ein besserer Optionsdienst oder eine asynchrone Aufgabe?
SpunkerBaba
16
Sie müssen beide verwenden. Sie erstellen einen Service und verwenden darin AsyncTask.
Pentium10
4
Zur obigen Antwort hinzufügen, durchläuft AsyncTask 4 Schritte: onPreExecute (), onProgressUpdate (Fortschritt ...) onPostExecute (Ergebnis), {wird im UI-Thread ausgeführt}, doInBackground (Params ...) {wird im Hintergrundthread ausgeführt}. Da der UI-Thread drei Methoden enthält, muss sich der Benutzer keine Gedanken über die Verwendung von Handlern oder Rückrufen zum Aktualisieren der Benutzeroberfläche machen.
SpunkerBaba
11
@ Pentium10: Anstelle von Service + AsyncTask können Sie häufig einen IntentService verwenden
njzk2
11
Bemerkenswert ist auch, dass Android-Dienste standardmäßig auf dem Hauptthread (UI) ausgeführt werden. Wenn Ihr Dienst im Hintergrund ausgeführt werden muss, muss er explizit in einem separaten Thread (oder AsyncTask) gestartet werden. Andernfalls besteht die Gefahr, dass die Reaktionsfähigkeit der Benutzeroberfläche unterbrochen wird und Fehler auftreten, die auf die Anwendung nicht reagieren. Ein Dienst für Android ist im Wesentlichen eine "unsichtbare" und "Miniatur" -Aktivität, NICHT unbedingt ein "Hintergrund" -Arbeiter.
CCJ
23

Dies ist die einfachste Antwort auf Ihre Frage

Faden

ist eine Ausführungseinheit, die "parallel" zum Haupt-Thread ausgeführt wird wird. ist ein wichtiger Punkt. Sie können hier keine UI-Komponente von einem beliebigen Thread außer dem Haupt-Thread aktualisieren.

AsyncTask

ist ein spezieller Thread, der Ihnen Hilfsmethoden zum Aktualisieren der Benutzeroberfläche bietet Hilfsmethoden zum Aktualisieren der Benutzeroberfläche bietet, sodass Sie die Benutzeroberfläche grundsätzlich aktualisieren können, selbst wenn AsyncTask auf einem Hintergrundthread ausgeführt wird. Die Verarbeitung der Interprozesskommunikation muss nicht explizit erfolgen.

Bedienung

Lösen Sie das oben genannte Problem, da es getrennt von der Aktivität lebt, die es aufruft, sodass es auch dann weiter ausgeführt werden kann, wenn die Aktivität zerstört wird. Es wird im Hauptthread ausgeführt (Vorsicht vor ANR). Verwenden Sie einen Hintergrunddienst (erweitern Sie IntentService, um den Arbeitsthread automatisch zu erstellen für dich) . Service ist wie eine Aktivität ohne Benutzeroberfläche , ist gut für lange Aufgaben

Alejandro Serret
quelle
4
AyncTask wird beim Drehen des Geräts nicht neu erstellt, da es nicht mit den Aktivitätslebenszyklusmethoden synchronisiert ist.
CopsOnRoad
4
Sie erstellen die AsyncTask in einem Aktivitätslebenszyklus-Hook. Wenn Sie das Telefon drehen, wird die Aktivität zerstört und neu gestartet. Die vorherige Instanz der AsyncTask ist mit der Aktivität verbunden, die Sie gerade zerstört haben. Aus diesem Grund erhalten Sie ein "Force Close", aber Sie werden auch sehen, wie eine neue Instanz der AsynTask erneut ausgelöst wird. Sie können Fragmente verwenden, um AsyncTask beizubehalten und setRetainInstance (true) für das Fragment festzulegen, das Ihnen helfen wird.
Alejandro Serret
15

Ich wünschte, jemand hätte es mir vor ein paar Tagen gesagt:

  • Sie können globale Variablen (z. B. Threads) zwischen Aktivitäten und Diensten freigeben.
  • Ihre Anwendung mit all ihren globalen Variablen wird nicht gelöscht, solange noch eine Aktivität oder ein Dienst vorhanden ist.
  • Wenn Ihre App eine Instanz eines Dienstes enthält und das Betriebssystem Ressourcen benötigt, werden zuerst Ihre Aktivitäten beendet. Solange jedoch der Dienst vorhanden ist, löscht das Betriebssystem Ihre Anwendung nicht zusammen mit den globalen Variablen.

Mein Anwendungsfall ist folgender: Ich habe einen Thread im globalen Bereich, der mit einem Server verbunden ist, und eine Aktivität, die die Ergebnisse anzeigt. Wenn der Benutzer die Home-Taste drückt, geht die Aktivität in den Hintergrund und ein neuer Dienst wird gestartet. Dieser Dienst liest dann die Ergebnisse aus dem Thread und zeigt bei Bedarf Informationen im Benachrichtigungsbereich an. Ich mache mir keine Sorgen, dass das Betriebssystem meine Aktivität zerstört, da ich weiß, dass der Thread zerstört wird, solange der Dienst ausgeführt wird.

Peter Jankuliak
quelle
9

Zusamenfassend, Service für time consuming tasks, AsyncTask für short-lived tasks, Thread ist ein standard java constructionfür Threads.

Abbath
quelle
3

Aus Entwicklersicht:

Thread : Wird verwendet, um den Satz auf Codes parallel zum Hauptthread auszuführen. Sie können jedoch nicht mit der Benutzeroberfläche innerhalb des Threads umgehen. Dafür müssen Sie verwenden Handler. Hadler funktioniert wie ein Thread, kann aber auch mit der Benutzeroberfläche umgehen.

ASyncTask : Wird zur Bearbeitung von Aufgaben verwendet, die Sie nicht für die Arbeit am Hauptthread ausführen können. Beispielsweise ist eine HTTP-Anforderung eine sehr schwere Arbeit, die im Hauptthread nicht bearbeitet werden kann. Sie behandeln die HTTP-Anforderung daher im ASyncTaskHintergrund. Sie funktioniert parallel zu Ihrem Hauptthread. Im Hintergrund werden nur wenige Rückrufmethoden aufgerufen Veranstaltungen.

Service : Ist ein Hintergrundprozess. Es wird verwendet, wenn Sie eine Verarbeitung durchführen müssen, der keine Benutzeroberfläche zugeordnet ist.

Rahul Raina
quelle
1
Servicewird nicht unbedingt im Hintergrund ausgeführt, es sei denn, Sie verwenden IntentService. Wenn Sie einen ServiceStandard vom UiThread aus gestartet haben, wird dieser auf dem UiThread ausgeführt.
Yshahak
@yshahak Du bist richtig, aber hier brauchen wir keine tiefe Definition. Der Benutzer möchte nur den Unterschied zwischen ihnen kennen.
Rahul Raina
Ja, aber dies ist nicht korrekt, da Servicees standardmäßig nicht in einem anderen Prozess ausgeführt wird, sondern im App-Prozess mit den anderen Komponenten. Besser gesagt, Servicedas läuft im Hintergrund des Threads, in dem es lebt.
Yshahak
Alle oben genannten drei funktionieren innerhalb des Bewerbungsprozesses. Die Methoden preExecute () und postExecute () von ASyncTask funktionieren mit UIThread und doInBackground () & onProgress () mit Hintergrundthread. Der Dienst funktioniert im Hintergrund-Thread und der Thread funktioniert auch im Hintergrund-Thread. Handler arbeitet jedoch mit UI-Thread.
Rahul Raina
2

Service ist wie eine Aktivität, die viel Zeit in Anspruch nimmt, aber mit der Async-Aufgabe können wir lange / Hintergrundoperationen ausführen und das Ergebnis auf dem UI-Thread anzeigen, ohne Threads bearbeiten zu müssen.

pankaj
quelle