Ho visto poche domande quasi identiche alle mie, ma non sono riuscito a trovare una risposta completa che soddisfi tutti i miei dubbi .. eccomi qui .. Supponiamo che tu abbia un'attività con una classe interiore che estende la classe AsyncTask
in questo modo:Cosa succede a un AsyncTask quando l'attività di avvio viene arrestata/distrutta mentre è ancora in esecuzione?
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")
}
}
Supponiamo che l'attività è in pausa o distrutta (forse i due casi sono diversi), mentre il DownloadImageTask
è ancora in esecuzione in background .. poi, i metodi DownloadImageTask
's che corrono sul filo di attività UI può essere attivato e il DownloadImageTask
può provare ad accedere ai metodi di Activity (è una classe interna, quindi può accedere ai metodi e alle variabili di istanza della classe esterna) con un'attività in pausa o distrutta, come la chiamata a findViewByID
nell'esempio seguente .. cosa succede allora? Fallisce silenziosamente? Produce qualche eccezione? L'utente verrà avvisato che qualcosa è andato storto?
Se dovremmo fare attenzione che il thread di avvio (l'attività in questo caso) sia ancora attivo quando vengono richiamati i metodi di esecuzione dell'interfaccia utente, come possiamo farlo all'interno dello AsyncTask
?
Mi dispiace se si trova questo come una domanda duplicato, ma forse questa domanda è un po 'più articolata e qualcuno può rispondere con maggiore dettaglio
Quando si eseguiva questo codice, si è verificato un errore silenzioso, generato un'eccezione o segnalato all'utente se qualcosa non funzionava correttamente? – CommonsWare
Non ho ancora eseguito questo codice, lo farò nei prossimi giorni. Mi stavo chiedendo prima di procedere con l'implementazione della mia app. Aggiornerò questo post non appena posso eseguire un test.Grazie @CommonsWare –
Il mio punto è che il comportamento non è documentato, in particolare dato che non stiamo vedendo nient'altro nell'attività. 'findViewById()' potrebbe restituire 'null' per' R.id.img', oppure no. E questo comportamento potrebbe teoricamente variare da dispositivo a dispositivo, in base alla versione del SO Android, alle modifiche del produttore del dispositivo e alle mod ROM. – CommonsWare