In einigen Fällen ist es möglich, dieselbe Aufgabe entweder mit einer AsyncTask
oder einer zu erledigen, Service
jedoch ist normalerweise eine für eine Aufgabe besser geeignet als die andere.
AsyncTask
s sind für einmalige zeitaufwändige Aufgaben konzipiert, die vom UI-Thread nicht ausgeführt werden können. Ein häufiges Beispiel ist das Abrufen / Verarbeiten von Daten, wenn eine Taste gedrückt wird.
Service
s sind so konzipiert, dass sie kontinuierlich im Hintergrund ausgeführt werden. Im obigen Beispiel zum Abrufen von Daten beim Drücken einer Taste können Sie einen Dienst starten, die Daten abrufen lassen und dann stoppen. Dies ist jedoch ineffizient. Es ist viel schneller, eine zu verwenden AsyncTask
, die einmal ausgeführt wird, die Daten zurückgibt und fertig ist.
Wenn Sie jedoch ständig etwas im Hintergrund tun müssen, Service
ist a die beste Wahl. Beispiele hierfür sind das Abspielen von Musik, die kontinuierliche Suche nach neuen Daten usw.
Wie Sherif bereits sagte, werden Dienste nicht unbedingt über den UI-Thread ausgeführt.
Zum größten Teil sind Service
s für den Fall gedacht, dass Sie Code ausführen möchten, auch wenn Ihre Anwendung Activity
nicht geöffnet ist. AsyncTask
s wurden entwickelt, um das Ausführen von Code aus dem UI-Thread unglaublich einfach zu machen.
Services sind völlig anders: Services sind keine Threads !
Ihre Aktivität ist an einen Dienst gebunden und der Dienst enthält einige Funktionen, die beim Aufruf den aufrufenden Thread blockieren. Ihr Service kann verwendet werden, um die Temperatur von Celsius auf Grad zu ändern. Jede Aktivität, die bindet, kann diesen Dienst erhalten.
Es handelt sich jedoch
AsyncTask
um einen Thread, der im Hintergrund arbeitet und gleichzeitig die Möglichkeit hat, Ergebnisse an den aufrufenden Thread zurückzumelden.Nur ein Gedanke: Ein Dienst kann ein
AsyncTask
Objekt haben!quelle
Service
ist eine der Komponenten des Android-Frameworks, für deren Ausführung keine Benutzeroberfläche erforderlich ist. Selbst wenn die App vom Benutzer nicht aktiv verwendet wird, können Sie einige Vorgänge mit dem Dienst ausführen. Das bedeutet nicht, dass der Dienst in einem separaten Thread ausgeführt wird, sondern im Hauptthread, und die Operation kann bei Bedarf in einem separaten Thread ausgeführt werden. Beispiele für die Verwendung sind das Abspielen von Musik im Hintergrund, das Synchronisieren von Daten mit dem Server im Hintergrund ohne Benutzerinteraktion usw.AsyncTask
Auf der anderen Seite werden UI-Blockierungsaufgaben verwendet, die in einem separaten Thread ausgeführt werden. Es ist dasselbe wie das Erstellen eines neuen Threads und das Ausführen der Aufgabe, wenn alle Aufgaben zum Erstellen und Verwalten der Threads und zum Zurücksenden des Ergebnisses an den Hauptthread von der Verwendung des AsyncTask-Beispiels erledigt werden. Dabei werden Daten vom Server abgerufen, CRUD-Vorgänge auf dem Content Resolver usw.quelle
Service- und Asynctask-Aufgaben tun fast dasselbe. Die Verwendung von Service oder Asynctask hängt fast davon ab, welche Anforderungen Sie stellen.
Wenn Sie beispielsweise Daten von einem Server in eine Listenansicht laden möchten, nachdem Sie eine Schaltfläche gedrückt oder den Bildschirm geändert haben, sollten Sie eine asynctask.it verwenden, die parallel zum Haupt-UI-Thread ausgeführt wird (wird im Hintergrund ausgeführt), um asynctack-Aktivitäten auszuführen, oder Ihre App sollte Auf dem Haupt-UI-Thread gibt es nach dem Beenden der App keine Asynctask.
Aber Dienste sind nicht so. Sobald Sie einen Dienst starten, kann er nach dem Beenden der App ausgeführt werden, es sei denn, Sie beenden den Dienst. Wie ich bereits sagte, hängt dies von Ihren Anforderungen ab. Wenn Sie weiterhin den Datenempfang oder den Netzwerkstatus überprüfen möchten kontinuierlich gehen Sie besser mit Service.
fröhliche Codierung.
quelle
In einigen Fällen können Sie mit beiden die gleiche Funktionalität erreichen. Im Gegensatz zu Async Task hat der Service einen eigenen Lebenszyklus und erbt den Kontext (Service ist robuster als eine Async Task). Der Dienst kann auch dann ausgeführt werden, wenn Sie die App beendet haben. Wenn Sie auch nach dem Schließen der App etwas tun möchten und auch die Kontextvariable benötigen, entscheiden Sie sich für Service.
Beispiel: Wenn Sie eine Musik abspielen möchten und nicht pausieren möchten, wenn der Benutzer die App verlässt, werden Sie auf jeden Fall den Service in Anspruch nehmen.
quelle
Vergleich eines lokalen, in Bearbeitung befindlichen Basisklassendienstes ✱ mit einem
AsyncTask
:✱ (Diese Antwort bezieht sich nicht auf exportierte Dienste oder Dienste, die in einem anderen Prozess als dem des Kunden ausgeführt werden, da sich die erwarteten Anwendungsfälle erheblich von denen eines unterscheiden
AsyncTask
. Im Interesse der Kürze auch die Art bestimmter spezialisierter DiensteService
Unterklassen (zBIntentService
,JobService
) wird hier ignoriert.)Prozesslebensdauer
A
Service
steht für das Betriebssystem für "den Wunsch einer Anwendung, einen länger laufenden Vorgang auszuführen, ohne mit dem Benutzer zu interagieren" [ ref ].Während Sie
Service
laufen, versteht Android, dass Sie nicht möchten, dass Ihr Prozess beendet wird. Dies gilt auch, wenn Sie einenActivity
Bildschirm haben, und dies gilt insbesondere dann, wenn Sie einen Vordergrunddienst ausführen . (Wenn alle Ihre Anwendungskomponenten verschwunden sind, denkt Android: "Oh, jetzt ist ein guter Zeitpunkt, um diese App zu beenden, damit ich Ressourcen freisetzen kann.")Abhängig vom letzten Rückgabewert von
Service.onCreate()
kann Android außerdem versuchen, Apps / Dienste "wiederzubeleben", die aufgrund des Ressourcendrucks beendet wurden [ ref ].AsyncTasks
Tu nichts davon. Es spielt keine Rolle, wie viele Hintergrund-Threads Sie ausführen oder wie hart sie arbeiten: Android hält Ihre App nicht am Leben, nur weil Ihre App die CPU verwendet. Es muss eine Möglichkeit geben zu wissen, dass Ihre App noch Arbeit zu erledigen hat. DeshalbServices
sind sie beim Betriebssystem registriert undAsyncTasks
nicht.Multithreading
AsyncTasks
Es geht darum, einen Hintergrund-Thread zu erstellen, an dem gearbeitet werden soll, und dann das Ergebnis dieser Arbeit dem UI-Thread threadsicher zu präsentieren.Jede neue
AsyncTask
Ausführung führt im Allgemeinen zu mehr Parallelität (mehr Threads), vorbehaltlich der Einschränkungen desAsyncTasks's
Thread-Pools [ ref ].Service
Methoden hingegen werden immer im UI-Thread [ ref ] aufgerufen . Dies gilt füronCreate()
,onStartCommand()
,onDestroy()
,onServiceConnected()
, etc. Also, in gewissem SinneServices
nicht "run" im Hintergrund. Sobald sie start (onCreate()
) sind, "sitzen" sie einfach da - bis es Zeit ist, aufzuräumen, eine auszuführenonStartCommand()
usw.Mit anderen Worten, das Hinzufügen von zusätzlichen
Services
führt nicht zu mehr Parallelität. Servicemethoden sind kein guter Ort, um viel Arbeit zu erledigen, da sie auf dem UI-Thread ausgeführt werden .Natürlich können Sie erweitern
Service
, Ihre eigenen Methoden hinzufügen und sie von jedem gewünschten Thread aus aufrufen. Wenn Sie dies tun, liegt die Verantwortung für die Thread-Sicherheit bei Ihnen - nicht beim Framework.Wenn Sie Ihrem Hintergrund einen Hintergrund-Thread (oder eine andere Art von Worker) hinzufügen möchten
Service
, können Sie dies tun. Sie könnten beispielsweise einen Hintergrund-Thread /AsyncTask
in startenService.onCreate()
. Dies ist jedoch nicht in allen Anwendungsfällen erforderlich. Beispielsweise:Service
Sie weiterhin ausgeführt werden, damit Sie weiterhin Standortaktualisierungen im "Hintergrund" erhalten (dh ohne unbedingt einenActivities
Bildschirm zu haben).BroadcastReceiver
Mitglied langfristig registrieren können (nach API 26 können Sie dies nicht immer über das Manifest tun, sodass Sie sich stattdessen zur Laufzeit registrieren müssen [ ref ]).Keiner dieser Anwendungsfälle erfordert viel CPU-Aktivität. Sie verlangen lediglich, dass die App nicht getötet wird .
Als Arbeiter
Services
sind nicht aufgabenorientiert. Sie sind nicht so eingerichtet, dass sie "eine Aufgabe ausführen" und "ein Ergebnis liefern"AsyncTasks
.Services
Lösen Sie keine Thread-Sicherheitsprobleme (ungeachtet der Tatsache, dass alle Methoden auf einem einzelnen Thread ausgeführt werden).AsyncTasks
Behandeln Sie diese Komplexität andererseits für Sie.Beachten Sie, dass
AsyncTask
ist für deprecation geplant . Aber das bedeutet nicht , Ihr sollte Ihre ersetzenAsyncTasks
mitServices
! (Wenn Sie aus dieser Antwort etwas gelernt haben, sollte so viel klar sein.)TL; DR
Services
sind meistens da, um "zu existieren". Sie sind wie ein Off-Screen-BildschirmActivity
und bieten einen Grund, warum die App am Leben bleibt, während andere Komponenten sich um die "Arbeit" kümmern.AsyncTasks
"arbeiten", aber sie werden an und für sich keinen Prozess am Leben erhalten.quelle