Ich habe einige Fragen fast identisch mit meinen gesehen, 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 AsyncTask
Klasse erweitert AngenommenWas passiert mit einer AsyncTask, wenn die Startaktivität gestoppt/zerstört wird, während sie noch ausgeführt wird?
public class MyActivity extends Activity {
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
protected Bitmap doInBackground(String... urls) {
return DownloadImage(urls[0]);
}
protected void onPostExecute(Bitmap result) {
ImageView img = (ImageView) findViewById(R.id.img);
img.setImageBitmap(result);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new DownloadImageTask().execute("http://mysite.com/image.png")
}
}
, dass die Aktivität angehalten oder zerstört (vielleicht die beiden Fälle unterschiedlich sind), während die DownloadImageTask
noch im Hintergrund läuft .. dann, die DownloadImageTask
‚s Methoden, die auf die Aktivität UI-Thread ausgeführt werden: dies wie kann ausgelöst werden und die DownloadImageTask
kann versuchen, auf Activity-Methoden zuzugreifen (es ist eine innere Klasse, so dass sie auf die Methoden und Instanzvariablen der äußeren Klasse zugreifen kann) mit einer pausierten oder zerstörten Aktivität, wie der Aufruf an findViewByID
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 Launch-Thread (die Aktivität in diesem Fall) noch aktiv ist, wenn Running-on-UI-Methoden aufgerufen werden, wie können wir das innerhalb der AsyncTask
erreichen?
Es tut mir leid, wenn Sie dies als eine doppelte Frage finden, aber vielleicht ist diese Frage ein bisschen mehr gelenkig und kann jemand mit ausführlicher beantworten
Wenn Sie diesen Code ausgeführt haben, ist es im Hintergrund fehlgeschlagen, hat eine Ausnahme ausgelöst oder dem Benutzer mitgeteilt, dass etwas schief gelaufen ist? – CommonsWare
Ich habe noch keinen solchen Code ausgeführt, ich werde es die nächsten Tage tun .. Ich habe mich gefragt, bevor ich in der Implementierung meiner App weitermache. Ich werde diesen Beitrag aktualisieren, sobald ich einen Test durchführen kann.Danke @CommonsWare –
Mein Punkt ist, dass das Verhalten undokumentiert ist, insbesondere angesichts der Tatsache, dass wir nichts anderes in der Aktivität sehen. 'findViewById()' könnte 'null' für' R.id.img' zurückgeben oder nicht. Und dieses Verhalten könnte von Gerät zu Gerät variieren, basierend auf der Android OS-Version, Änderungen des Geräteherstellers und ROM-Mods. – CommonsWare