9

In der aktuellen App, die ich mit einem Mitarbeiter entwickle, verwenden wir IntentServices mit Calls von Volley, um RESTful-API-Netzwerkanforderungen zu verarbeiten. Es sind nur einfache JSON-String-Daten und einige kleine Bilder.Gibt es Entwicklungsmuster, die einen IntentService für Netzwerkanforderungen ersetzen können?

Meine Frage an diejenigen, die Erfahrung mit der Verarbeitung von Netzwerkanforderungen haben, ist folgende: Gibt es etwas passenderes oder saubereres, das da draußen zu implementieren?

Von was ich verstehe, ist der Vorteil eines IntentService, dass es im Hintergrund vom Hauptthread ausgeführt wird, und ist in der Regel eines der letzten Dinge, die von Android OS getötet werden. Der Nachteil ist, dass IntentServices sequenziell ausgeführt werden.

Ich habe viel über RxJava und Retrofit gelesen und fühle mich, als ob unsere Bedürfnisse mit dieser Kombination besser bedient werden könnten. Retrofit mag alleine genug sein, aber ich würde wirklich einige Einblicke von Drittanbietern schätzen.

+0

Sie möchten Android Volley Library erkunden: https://developer.android.com/training/volley/index.html – AADProgramming

+0

@AADTechnical Hier ist der interessante Teil, wir verwenden Volley in unseren IntentServices. –

+0

Ich würde Rxjava auf jeden Fall empfehlen und – 3xplore

Antwort

21

Meine Faustregel ist:

  • Wenn die Netzwerk-I/O unter einer Sekunde sein sollte, und es Ihnen nichts ausmachen, wenn es nicht zum Abschluss läuft, jede asynchrone Option sollte in Ordnung sein .

  • Wenn die Netzwerk-E/A länger als eine Sekunde dauern sollte, oder Sie die Wahrscheinlichkeit erhöhen möchten, dass sie vollständig ausgeführt wird, verwenden Sie Service. Ob Sie IntentService oder eine andere Service Implementierung verwenden, liegt bei Ihnen, aber Sie wollen eine Service als Indikator für das Betriebssystem haben, dass Sie arbeiten, damit es Ihren Prozess nicht ganz so schnell beendet, sobald Ihre App verschoben wird der Hintergrund. Denken Sie daran, dass "in den Hintergrund rückt" nicht immer etwas ist, das direkt vom Benutzer initiiert wird, da eingehende Anrufe und so auch Sie in den Hintergrund bewegen.

  • Wenn die Netzwerk-I/O länger als 15 Sekunden dauern, nicht nur, dass Sie ein Service verwenden müssen, aber Sie müssen über ein WakeLock denken (über meine WakefulIntentService oder WakefulBroadcastReceiver oder eigene sorgfältig verwaltet WakeLock) und möglicherweise eine WifiLock. 15 Sekunden ist die minimale automatische Abschaltzeit in den Einstellungen, von der diese Zahl kommt.

Mit allem im Sinn:

Der Nachteil ist, dass IntentServices sequenziell ausgeführt werden.

Ich übersetze dies als "ein IntentService hat einen einzigen Thread für die Bearbeitung von Anfragen". Das ist wahr. Wenn Sie eine Service benötigen und Parallelverarbeitung benötigen, erstellen Sie Ihre eigene Service. Seien Sie sicher, stopSelf() zu nennen, wenn Sie keine ausstehenden Arbeiten haben.

Ich habe viel über RxJava gelesen, und Retrofit, und fühle mich wie unsere Bedürfnisse besser mit dieser Kombination bedient werden konnten

Das hat nichts damit zu tun, ob Sie eine Service verwenden . Versuchen Sie einfach nicht, asynchrone Dinge (z. B. einen Retrofit-Anruf mit einer Callback) von einer IntentService zu tun, da Sie den Zweck der IntentService besiegen (was dem Betriebssystem anzeigt, dass Sie arbeiten). Von einer IntentService würden Sie die synchrone API von Retrofit verwenden, ohne eine Callback.

+0

Dies ist eine großartige Erklärung, danke. Um sicherzustellen, dass ich den Anwendungsfall verstehe: Ich möchte einen Dienst verwenden, wenn ich Netzwerkergebnisse mit meiner Datenbank synchronisiere (da ich wirklich möchte, dass dies korrekt ausgeführt wird), aber wenn ich einfach einen JSON - Blogposttext (oder Daten, die klein genug sind, um schnell wieder abgerufen zu werden), ist es nicht wichtig genug, um den Aufwand für die Einrichtung eines Dienstes zu bewältigen. Macht das Sinn? –

+1

@RyanSimon: Das scheint vernünftig. Meine typische Analogie ist ein Twitter-Client. Sie brauchen wirklich keinen Service zum Herunterladen von Avataren. Sie könnten einen Dienst zum Herunterladen von Zeitleisten verwenden, aber das wäre vor allem dann der Fall, wenn Sie sie offline synchronisieren und Sie die lokale Datenbank regelmäßig aktualisieren ("AlarmManager", "SyncManager" usw.). Auch wenn Sie einen Tweet veröffentlichen, können Sie den Dienst überspringen. Aber das Einrichten eines neuen Twitter-Kontos oder jeder Vorgang, der sich mit Anhängen befassen könnte (z. B. das Hochladen eines Bilds als Teil eines Tweets), sollte einen Dienst verwenden. – CommonsWare

0

Verwendung von IntentServices, nur um eine einfache Netzwerkanforderung, IMO, durchzuführen, ist zu viel. Sie sollten eine AsyncTask verwenden, wenn Sie keine Bibliothek verwenden möchten oder wenn Sie lieber Retrofit, Volley ... (Ich würde Retrofit empfehlen). IMO, Dienste oder in diesem Fall IntentService dienen dazu, lange Hintergrundaufgaben auszuführen.

+0

Was sagen Sie, dass ein IntentService für eine Netzwerkanforderung zu viel ist? Was ist mit einer schlechten Übung? –

+0

"Die Verwendung von IntentServices nur zum Ausführen einer Netzwerkanforderung ist zu viel" - das hängt ganz davon ab, was die Netzwerkanforderung ist. Das Herunterladen einer großen Datei unterscheidet sich beispielsweise vom Herunterladen eines Twitter-Avatars. – CommonsWare

+0

True @CommonsWare, ich werde die Antwort aktualisieren. IMO, verwende ich nur einen IntentService, wenn ich eine Reihe von Anfragen ausführen muss oder eine Anfrage durchführen und Daten persistieren muss ... Um eine einzelne Anfrage durchzuführen, verwende ich etwas einfacheres zu integrieren, wie Retrofit oder andere Tools. –

0

Die eigentliche Frage ist: Laden Sie Daten, um eine Aktivität im Vordergrund zu füllen oder Hintergrundarbeit zu erledigen, auch wenn keine Benutzeroberfläche sichtbar ist?

Für Hintergrundarbeit ist ein Service der Weg zu gehen. Sie benötigen nicht einmal einen IntentService, wenn Sie sich auf das Threading-Management von Volley verlassen.

Verwenden Sie für Arbeiten im Vordergrund die Verwendung von Loadern oder Volley- oder Rxjava-Aufrufen direkt in Ihrer Aktivität/Ihrem Fragment.

+0

Ja, wir verwenden meistens die Netzwerkanforderungen für die Aktualisierung der Benutzeroberfläche –