2016-04-26 6 views
0

heißt. Ich möchte eine lange Operation Task von onDestroy() aus einem Fragment ausführen. Mein Ziel ist es, einen Netzwerkanruf zu tätigen, um einige Daten zu löschen, falls der Benutzer die Anwendung schließt, indem er sie von den letzten Apps wischt. Ich möchte eine Absicht starten, wenn onDestroy() aufgerufen wird.Führen Sie eine lange Aufgabe aus, wenn onDestroy()

Im Moment, wenn ich versuche, die Absicht zu initiieren, verliere ich den Kontext, bevor ich eine Chance habe, den Anruf zu betreiben, da onDestroy() bereits meine Anwendung getötet hat.

Ich möchte diese Option nicht verwenden: Performing long running operation in onDestroy seit ein Thread wie so laufen ist nicht der richtige Weg, es zu tun, und scheint wie ein gefährlicher Hack.

Der Aufruf der Operation von onDestroy() der Aktivität führte zum selben Fehler.

Natürlich möchte ich keine Arbeit auf dem ui-Thread und "verschieben" die onDestroy(), bis meine Operation abgeschlossen ist.

Nur für die Freigabe, während GetContext() nicht null ist, bis der SomeService-Klasse erreichen, ist der Kontext bereits null, da das Senden einer Absicht eine asynchrone Operation ist.

@Override 
    public void onDestroy() { 
     Intent intent = new Intent(getContext(), SomeService.class); 
     getContext().startService(intent); 
     super.onDestroy(); 
    } 

Antwort

1

rate ich würde starten und zu binden Service während etwa onCreate() Ihrer Activity und dann Dienst gebunden ist können Sie leicht Bereinigungsprogramm in Ihrem Service platziert starten, das heißt Sie sollten Service Start- und Starten des Bereinigungs teilen.

Like:

//somewhere in onCreate() 
myServiceIntent = new Intent(this.getApplicationContext(), MyService.class); 
context.startService(myServiceIntent); 
context.bindService(myServiceIntent, serviceConnection, Context.BIND_AUTO_CREATE); 

und dann in onDestroy()

public void onDestroy() { 
    myService.cleanup(); 
    super.onDestroy(); 
} 

Lesen Sie mehr über service binding

0

bewusst sein onDestroy() nicht aufgerufen werden, ist garantiert.

Anwendungskontext verwenden.

Der gebundene Dienst wird so lange funktionieren, wie eine Komponente an ihn gebunden ist. Daher ist Ihre Variante mit gestartetem Dienst besser. Vergessen Sie nicht, stopSelf() zu verwenden, nachdem ein Auftrag abgeschlossen wurde.

Verwandte Themen