Was passiert mit einer AsyncTask, wenn die Startaktivität gestoppt / zerstört wird, während sie noch läuft?

9

Ich habe einige Fragen gesehen, die fast identisch mit meinen sind, aber ich konnte keine vollständige Antwort finden, die alle meine Zweifel erfüllt. Also hier bin ich .. Angenommen, Sie haben eine Aktivität mit einer inneren Klasse, die die% erweitert co_de% klasse wie folgt:

%Vor%

Angenommen, die Aktivität ist pausiert oder zerstört (möglicherweise sind die beiden Fälle unterschiedlich), während AsyncTask noch im Hintergrund ausgeführt wird. Dann können die Methoden DownloadImageTask , die auf dem Aktivitäts-UI-Thread ausgeführt werden, ausgelöst werden und der DownloadImageTask kann versuchen, auf Activity-Methoden zuzugreifen (es ist eine innere Klasse, also kann er auf die Methoden und Instanzvariablen der äußeren Klasse zugreifen) mit einer pausierten oder zerstörten Aktivität, wie der Aufruf von DownloadImageTask im Beispiel unten .. was passiert dann? Scheitert es im Stillen? Gibt es eine Ausnahme? Wird der Benutzer benachrichtigt, dass etwas schief gelaufen ist?

Wenn wir darauf achten sollten, dass der Startthread (die Aktivität in diesem Fall) noch aktiv ist, wenn Running-on-UI-Methoden aufgerufen werden, wie können wir das innerhalb von findViewByID ?

erreichen?

Es tut mir leid, wenn Sie das als doppelte Frage finden, aber vielleicht ist diese Frage ein wenig artikulierter und jemand kann detaillierter antworten

    
Gianni Costanzi 24.08.2012, 21:41
quelle

2 Antworten

3

Betrachten Sie diese Aufgabe (wobei R.id.test auf eine gültige Ansicht im Layout meiner Aktivität verweist):

%Vor%

Wenn ich diese Aufgabe von einem onCreate einer Aktivität wie folgt ausführen:

%Vor%

Egal wie lange ich den Hintergrundthread ausschalte, mein Log zeigt immer:

%Vor%

Was bedeutet, dass die Aktivität und ihre Ansichten am Leben zu bleiben scheinen (selbst wenn ich GCs manuell über DDMS ausstelle). Wenn ich mehr Zeit hätte, würde ich mir einen Speicherauszug ansehen, aber ansonsten weiß ich nicht genau, warum das der Fall ist ... aber als Antwort auf deine Fragen scheint es so:

>
  • Scheitert es im Stillen? Nein
  • Führt es zu einer Ausnahme? Nein
  • Wird der Benutzer benachrichtigt, dass etwas schief gelaufen ist? Nein
newbyca 04.09.2012 16:10
quelle
2

Das doInBackground () wird auch dann weiter ausgeführt, wenn Ihre Aktivität zerstört wird (dh Ihr Hauptthread wird zerstört), weil die Methode doInBackground () auf dem / thread des Arbeiters / Hintergrunds ausgeführt wird. Beim Ausführen der onPostExecute () -Methode wird ein Problem auftreten, wenn sie im main- / UI-Thread ausgeführt wird und Sie möglicherweise in nicht verwandte Daten geraten, aber dem Benutzer wird keine Ausnahme angezeigt. Daher ist es immer besser, Ihre AsyncTask abzubrechen, wenn Ihre Aktivität zerstört wird, da es keinen Grund gibt, AsyncTask auszuführen, wenn die Aktivität nicht mehr vorhanden ist. Verwenden Sie den Android-Dienst, wenn Sie ständig etwas aus dem Netzwerk herunterladen möchten, selbst wenn Ihre Komponente / Aktivität zerstört wird. Vielen Dank.

    
Kaveesh Kanwal 18.04.2015 10:21
quelle