2010-08-19 9 views
7

Ich bin verwirrt zwischen Thread und Service auf Android. Wenn ich eine Datei vom Server herunterladen muss. Es können mehrere Dateien gleichzeitig sein. Was soll ich in dieser Situation, Thread oder Services wählen?Thread oder Dienstleistungen

Antwort

13

Doing Stuff in einem Service macht es nicht im Hintergrund laufen. Sie müssen auch einen Thread in Ihrem Dienst erstellen, um auf den Abschluss des Downloads zu warten.

Wenn Sie einen Thread verwenden, der lokal für eine Aktivität ist, haben Sie Probleme mit dem Verlassen der Aktivität, Senden in den Hintergrund oder eine Unterbrechung wegen eines eingehenden Anrufs usw. Dies kann dazu führen, dass Ihre App von der OS, um Speicher freizugeben. In diesem Fall ist Ihr Thread verloren und wird möglicherweise nicht neu gestartet und führt zum Absturz Ihrer App.

Wenn Sie einen Dienst erstellen, ist es nicht so wahrscheinlich, dass er gelöscht wird als ein Thread und Sie können das Betriebssystem angeben, um den Dienst neu zu starten, nachdem es vom Betriebssystem beendet wurde. Dies macht den Service zu einer sichereren Wahl für sehr lange Downloads. Ich verwende einen Dienst in einer meiner Apps, um eine 20 MB-Datei herunterzuladen und in diesem Dienst einen Thread zu erstellen, der den Download durchführt.

Ein Dienst hilft Ihnen nur, den Download zu kapseln und entkoppelt ihn von der Aktivität und gibt Ihnen einen anderen Zustand im Betriebssystem, der verhindern wird, dass der Thread einfach wegen zu wenig Arbeitsspeichers verschwindet.

+0

danke für deine antwort! Also sollte ich einem Dienst helfen, der einen Thread speichert, nicht wahr? –

+0

Darüber hinaus gibt es fünf Ebenen in der Wichtigkeitshierarchie des Android-Prozesses. Und wie @ Janusz sagte, "Verwendung von Thread oder Service" kann die Bedeutung seines Prozesses beeinflussen."Da ein Prozess, der einen Dienst ausführt, höher eingestuft wird als ein Prozess mit Hintergrundaktivitäten, kann eine Aktivität, die eine lang andauernde Operation initiiert, einen Dienst für diese Operation starten, anstatt einfach einen Worker-Thread zu erstellen - insbesondere, wenn die Operation ausgeführt wird wahrscheinlich die Aktivität überdauern. " –

+0

"Zum Beispiel sollte eine Aktivität, die ein Bild auf eine Website hochlädt, einen Dienst starten, um den Upload durchzuführen, damit der Upload im Hintergrund fortgesetzt werden kann, selbst wenn der Benutzer die Aktivität verlässt." von http://developer.android.com/guide/components/processes-and-threads.html –

0

Thread ist in Ordnung für eine Aufgabe im Hintergrund für eine Anwendung. Sie möchten einen Dienst verwenden, wenn Sie diesen für mehrere Anwendungen benötigen.

0

Wenn Sie eine Schnittstelle für andere Apps bereitstellen möchten, um mit Ihrem Download-Activity: Service zu kommunizieren. Wenn der Download nur im Hintergrund ausgeführt werden soll, damit der Benutzer mit der Benutzeroberfläche interagieren kann.

18

Was sollte ich in dieser Situation Thread oder Dienstleistungen wählen?

Es ist kein "oder". Es ist ein "und". Sie verwenden einen Hintergrundthread und einen Dienst.

Ein Dienst ist aus Sicht der Benutzeroberfläche "im Hintergrund", da er keine Benutzeroberfläche hat. Ein Dienst ist vom Standpunkt des Threads aus nicht automatisch "im Hintergrund", da onCreate(), onDestroy(), onStart() und onBind() alle im Hauptanwendungsthread aufgerufen werden, derselbe Thread, der von allen Aktivitäten dieser Anwendung gemeinsam genutzt wird. Alles, was lange läuft, wie ein Download, muss außerhalb des Hauptanwendungs-Threads erfolgen, z. B. unter Verwendung einer AsyncTask.

Wenn Ihre Downloads fortgesetzt werden müssen, selbst wenn die Aktivität, die sie ausgelöst hat, zerstört wird, müssen Sie einen Dienst verwenden, wobei der Dienst einen AsyncTask oder Hintergrundthread verwendet, um den Download abzuschließen. Noch besser ist es, einen IntentService zu verwenden, der einen regulären Dienst mit einem Hintergrundthread kombiniert.

+0

das ist wirklich gut erklärt. Sehr einfach zu verstehen. – webgenius

+0

danke für deine antwort! Also sollte ich einem Dienst helfen, der einen Thread speichert, nicht wahr? –

0

Ihre Frage ist bereits in der documentation. Überprüfen Sie die rechte Spalte.

Verwandte Themen