2010-04-13 17 views
27

Welche Vor-/Nachteile bestehen bei der Platzierung eines langen Netzwerkzugriffscodes in einem Thread in einer Aktivität oder einem Thread in einem Service? Wie würde es die Anwendung beeinflussen? Ich schreibe einen Streaming-Audio-Player und von dem, was ich bisher gelesen habe, den Code in einen Dienst zu stecken wird immer noch die Anwendung blockieren, so dass ein neuer Thread benötigt wird, weiß jemand, ob es sinnvoller ist, dieses Stück Code zu setzen in einem Dienst.Anwendungs-Threads vs. Service-Threads

Antwort

35

Ja, ein blockierender Vorgang in einem Dienst blockiert die Anwendung weiterhin. Trotz der ersten Aufrufe dienen Dienste nicht dazu, Aufgaben im Hintergrund auszuführen. Sie dienen zum Ausführen von Aufgaben mit einem Lebenszyklus, der unabhängig vom Aktivitätslebenszyklus ist (IE, sie können nach dem Schließen der Aktivität fortgesetzt werden).

Ein Dienst, der beim Starten und Beenden einer Aktivität beginnt, wenn die Aktivität endet, ist nutzlos.

In Ihrem Fall, in dem Sie Audio streamen, möchten Sie möglicherweise Audio streamen, auch nachdem der Benutzer die Aktivität beendet hat. In diesem Fall sollten Sie einen Dienst verwenden, aber Sie benötigen weiterhin einen Thread (oder eine AsyncTask)) zum Blockieren von Aufgaben.

+0

Danke, das habe ich mir gedacht. Zu einem verwandten Thema, zumindest im Emulator, nachdem ich den Streaming Player gestartet habe, würde es auch nach dem Drücken der Zurück-Taste weiterspielen. Ich ging davon aus, dass es aufhören würde, wenn die Aktivität nicht mehr im Vordergrund stand ... ist es wegen des neuen Threads oder wird es trotzdem spielen, bis Android die Anwendung beendet. – zerayaqob

+0

Ja, der Thread wird weiterlaufen, bis Android ihn tötet. Wenn Sie möchten, dass es aufhört, implementieren Sie eine Art "aktives" Flag und setzen Sie es in Ihrer onDestroy() -Methode auf false. – synic

+3

Beachten Sie auch, dass Threads in einer 'Activity' zerstört werden, wenn sich die Konfiguration (read: orientation) ändert! Dies gilt nicht für Threads in 'Service's. – MrSnowflake

1

Aus meiner Erfahrung (1+ Jahre Entwicklung von Android) gibt es keinen Unterschied zwischen dem Ausführen eines neuen Threads in einem Dienst oder in einer Aktivität. Versuchen Sie nicht, einen Verweis auf die Aktivität im neuen Thread beizubehalten - verwenden Sie den Anwendungskontext.

Auch der Lebenszyklus des Dienstes konnte nicht helfen, da einige Methoden nicht aufgerufen werden garantiert :(

Der einzige Unterschied sein kann, dass der Dienst ohne Zerstörung die App komplett zerstört werden kann - so potenziell die neuen Themen zu zerstören Warum möglicherweise, weil auf der praktischen Seite, dies nicht geschieht die App IMMER getötet wird, ohne vorher den Dienst zu töten, was bedeutet:.?. der lokale Service-Mechanismus ist nutzlos !! !

Remote-Service ist eine andere Diskussion - ich bezog mich nur auf "wo soll ich einen neuen Thread ausführen?".

Viel Glück !!!

+0

Können Sie eine Situation angeben, in der Sie einen neuen Thread in einem Dienst ausführen müssen, anstatt nur einen neuen Thread in einer Aktivität auszuführen, um dieselbe Aufgabe auszuführen? – committedandroider

+0

@committedandroider Sagen wir, Sie haben eine Browser App und der Benutzer wählt eine Datei von 1 GB herunterzuladen. Der Nutzer wird Ihre Browser-App nicht geöffnet lassen und warten, bis die Datei heruntergeladen ist. Er startet einfach den Download und beendet die App.Wenn in diesem Fall der Thread, der von Activity erzeugt wurde, nicht mehr läuft, müssen Sie einen Thread aus dem Service spawnen. – CopsOnRoad

+0

@Jack ja, das macht Sinn. Das war vor langer Zeit lol – committedandroider

Verwandte Themen