He visto algunas preguntas casi idénticas a las mías, pero no pude encontrar una respuesta completa que satisfaga todas mis dudas ... así que aquí estoy ... Supongamos que tienes una actividad con una clase interna que amplía la clase AsyncTask
de esta manera:¿Qué le sucede a una AsyncTask cuando se detiene/destruye la actividad de inicio mientras aún está en ejecución?
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")
}
}
Supongamos que la actividad está en pausa o destruido (tal vez los dos casos son diferentes), mientras que el DownloadImageTask
todavía se está ejecutando en segundo plano .. entonces, los métodos 's la DownloadImageTask
que se ejecutan en el subproceso de interfaz de usuario de la actividad puede activarse y el DownloadImageTask
puede intentar acceder a los métodos de Activity (es una clase interna, por lo que puede acceder a los métodos y variables de instancia de la clase externa) con una Actividad pausada o destruida, como la llamada a findViewByID
en el siguiente ejemplo ... ¿qué pasa entonces? ¿Silenciosamente falla? ¿Produce alguna excepción? ¿Se notificará al usuario que algo salió mal?
Si deberíamos tener cuidado de que el hilo de inicio (la Actividad en este caso) todavía está vivo cuando se invocan los métodos de ejecución en la interfaz de usuario, ¿cómo podemos lograr eso desde el AsyncTask
?
Lo siento si encuentra esto como una pregunta duplicado, pero tal vez esta pregunta es un poco más articulada y alguien puede responder con mayor detalle
Cuando ejecutó este código, ¿silenció silenciosamente, produjo alguna excepción o notificó al usuario que algo salió mal? – CommonsWare
Aún no he ejecutado un código así, lo haré en los próximos días. Me lo pregunté antes de continuar con la implementación de mi aplicación. Actualizaré esta publicación tan pronto como pueda ejecutar una prueba.Gracias @CommonsWare –
Mi punto es que el comportamiento no está documentado, particularmente dado el hecho de que no estamos viendo nada más en la actividad. 'findViewById()' puede devolver 'null' para' R.id.img', o puede que no. Y ese comportamiento podría variar de un dispositivo a otro, según la versión del sistema operativo Android, las modificaciones del fabricante del dispositivo y las modificaciones del ROM. – CommonsWare