Es una muy buena pregunta, se necesita tiempo como programador de Android para comprender completamente el problema. De hecho, AsyncTask tiene dos problemas principales relacionados:
- Están mal vinculados al ciclo de vida de la actividad.
- Crean pérdidas de memoria muy fácilmente.
Dentro de la aplicación RoboSpice Motivations ( disponible en Google Play ) respondemos esa pregunta en detalle. Le dará una vista en profundidad de AsyncTasks, Loaders, sus características e inconvenientes y también le presentará una solución alternativa para solicitudes de red: RoboSpice. Las solicitudes de red son un requisito común en Android y, por naturaleza, son operaciones de larga duración. Aquí hay un extracto de la aplicación:
El ciclo de vida de AsyncTask y Activity
AsyncTasks no sigue el ciclo de vida de las instancias de actividad. Si inicia una AsyncTask dentro de una actividad y gira el dispositivo, la actividad se destruirá y se creará una nueva instancia. Pero AsyncTask no morirá. Seguirá viviendo hasta que se complete.
Y cuando se complete, AsyncTask no actualizará la interfaz de usuario de la nueva actividad. De hecho, actualiza la instancia anterior de la actividad que ya no se muestra. Esto puede llevar a una excepción del tipo java.lang.IllegalArgumentException: Vista no adjunta al administrador de ventanas si usa, por ejemplo, findViewById para recuperar una vista dentro de la Actividad.
Problema de pérdida de memoria
Es muy conveniente crear AsyncTasks como clases internas de sus actividades. Como AsyncTask necesitará manipular las vistas de la Actividad cuando la tarea esté completa o en progreso, el uso de una clase interna de la Actividad parece conveniente: las clases internas pueden acceder directamente a cualquier campo de la clase externa.
Sin embargo, significa que la clase interna tendrá una referencia invisible en su instancia de clase externa: la Actividad.
A largo plazo, esto produce una pérdida de memoria: si AsyncTask dura mucho, mantiene la actividad "viva" mientras que a Android le gustaría deshacerse de ella porque ya no se puede mostrar. La actividad no puede recolectarse basura y ese es un mecanismo central para que Android preserve los recursos en el dispositivo.
Realmente es una muy muy mala idea usar AsyncTasks para operaciones de larga ejecución. Sin embargo, están bien para los de vida corta, como actualizar una Vista después de 1 o 2 segundos.
Te animo a que descargues la aplicación RoboSpice Motivations , que realmente explica esto en profundidad y proporciona muestras y demostraciones de las diferentes formas de realizar algunas operaciones en segundo plano.
doInBackground
congela la pantalla si no se usa una barra de progreso.