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
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.
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.
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.
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.
das ist wirklich gut erklärt. Sehr einfach zu verstehen. – webgenius
danke für deine antwort! Also sollte ich einem Dienst helfen, der einen Thread speichert, nicht wahr? –
Ihre Frage ist bereits in der documentation. Überprüfen Sie die rechte Spalte.
- 1. Singleton Klasse Hintergrund Dienstleistungen
- 2. Probleme zu Dienstleistungen
- 3. Inheritance in Dienstleistungen
- 4. Ionic Controller und Dienstleistungen
- 5. Dienstleistungen vs Fabrik in agularJs
- 6. Thread/threadpool oder backgroundworker
- 7. Boost.Thread oder nur :: thread?
- 8. Android Hintergrund Dienstleistungen Best Practice
- 9. Serving Dateien über Frühling Dienstleistungen
- 10. GREG Dienstleistungen Bulk-Load-Ansatz
- 11. Docker Trennung von Anliegen/Dienstleistungen
- 12. Angular2 Dienstleistungen Injection in Bootstrap
- 13. Angular Projektstruktur (Ordner, Routen, Dienstleistungen, etc.)?
- 14. Mehrdeutige Anruf services.AddOptions() in ConfigureServices (IServiceCollection Dienstleistungen)
- 15. time.sleep - schläft Thread oder Prozess?
- 16. Um mehrere Thread oder nicht
- 17. Dienstleistungen von den verschiedenen Java EE-Containern
- 18. AngularJS Controller-Einheit Tests - injizierende Dienstleistungen
- 19. Blockiert ThreadPool.RegisterWaitForSingleObject den aktuellen Thread oder einen Threadpool-Thread?
- 20. Kommunikation zwischen zwei Dienstleistungen mit BroadcastReceiver
- 21. Teilen von Daten unter Aktivitäten und Dienstleistungen
- 22. Symfony 2 Funktionstests mit verspottete Dienstleistungen
- 23. Empfohlene Architektur Dienstleistungen in Angular 2
- 24. Empfänger und Dienstleistungen auf dem Manifest
- 25. Komponententests von Dienstleistungen/Fabriken - AngularJS - Jasmine
- 26. Dynamics CRM 2016 für professionelle Dienstleistungen
- 27. Wie Container als Argument an Dienstleistungen
- 28. Inject Dienstleistungen in Grails Einheit Test
- 29. Hosting WCF Dienstleistungen in Asp.Net MVC-Projekt
- 30. Alter, wo ist mein Thread ?? (oder: benenne einen .NET-Thread-Pool-Thread um - ist das möglich?)
danke für deine antwort! Also sollte ich einem Dienst helfen, der einen Thread speichert, nicht wahr? –
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. " –
"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 –