2

Ich weiß, dass ein Intent Service beendet wird, sobald die Arbeit abgeschlossen ist. Ich mache Netzwerkanrufe auf onHandleIntent(). Der Dienst stirbt, sobald es startet, aber die Netzwerkaufrufe erfolgreich abgeschlossen.Warum wird onDestroy() aufgerufen, sobald Intent Service gestartet wird?

Ist es, weil alle Methoden für Netzwerkanrufe aufgerufen werden und sie existieren in einem anderen Thread? Also stirbt der Dienst?

@Override 
protected void onHandleIntent(@Nullable Intent intent) { 
    Log.i(TAG, "Download Service Started!"); 
    initVariables(); 
    startDownloadService(intent); 
} 

private void startDownloadService(Intent intent) { 
    receiver = intent.getParcelableExtra("receiver"); 
    notifyDownloadRunning("Trying to start Download"); 

    getNews(); 
    getVideoDetails(); 
    ................. 
} 

Retorfit Schnittstelle

@GET() 
Observable<VideoDetailsRoot> getVideoDetails(@Url String url); 
+0

@tynn Ich habe meine Frage jetzt bearbeitet. –

Antwort

2

Sie zweimal das Einfädeln der Handhabung. Einmal mit dem IntentService und einmal mit Retrofit und Rx.

Wenn Sie eine Observable abonnieren, blockieren Sie den aktuellen Thread (die meiste Zeit) nicht und warten stattdessen asynchron auf das Ergebnis. In Ihrem Fall können Sie die Implementierung des IntentService mit gutem Gewissen überspringen. Retrofit und Rx bieten Ihnen genügend Funktionen, um das Herunterladen asynchron durchzuführen, ohne den Hauptthread zu blockieren.

Wenn Sie den Dienst beibehalten möchten, müssen Sie den Netzwerkteil synchron machen oder warten, bis die Abonnements abgeschlossen sind. Aber all dies könnte eine missbräuchliche Verwendung von Retrofit selbst sein.

+0

Ich starte den Dienst, wenn Daten aktualisiert werden müssen. Was schlagen Sie vor, damit meine Netzwerkaufrufe überall getätigt werden können, ohne an eine Aktivität oder ein Fragment angehängt zu sein? ClassName.fetchdata() wäre ideal –

+0

Sie benötigen keinen Kontext, nur einen Verweis auf den Retrofit-Service. Wenn Sie einen Kontext benötigen, geben Sie diesen als Parameter an. Also kapseln Sie es irgendwie (wie Sie wollen;) und stellen Sie es als Abhängigkeit bereit, wann immer Sie es brauchen. Ich würde vorschlagen, dass Sie es nicht statisch implementieren. Aber es ist natürlich möglich. – tynn

+0

Oh ein kleines Leck kann ein Schiff versenken. Mit angehängt meinte ich wie ich write getNewsFrom() einmal aufrufen und das entweder auf splashsceen, pull zum refresh oder bei Benachrichtigung click aufrufen kann. Denkst du, es ist machbar, wenn ich statische Methoden für API-Aufrufe schreibe. Ich würde sie dann einmal ein Ereignis wie Pull zu aktualisieren nennen oder irgendetwas passiert –

Verwandte Themen