Aprendiendo Desarrollo Android - AsyncTask
AsyncTask
AsyncTask permite el uso adecuado y sencillo del subproceso de interfaz de usuario(UI). Esta clase le permite realizar operaciones en segundo plano y publicar resultados en el subproceso de interfaz de usuario sin tener que manipular subprocesos y / o controladores.
AsyncTask está diseñado para ser una clase auxiliar en torno a Thread y Handler y no constituye un marco de subprocesamiento genérico. AsyncTasks idealmente debe ser utilizado para operaciones cortas (unos pocos segundos a lo mucho). Si necesita mantener los threads en ejecución durante largos períodos de tiempo, se recomienda utilizar las diversas API proporcionadas por el paquete java.util.concurrent tales como Executor, ThreadPoolExecutor y FutureTask.
Una tarea asincrónica se define por un cálculo que se ejecuta en un subproceso de fondo y cuyo resultado se publica en el subproceso de interfaz de usuario. Una tarea asincrónica está definida por 3 tipos genéricos, llamados Params, Progress y Result, y 4 pasos, llamados onPreExecute, doInBackground, onProgressUpdate y onPostExecute.
Uso
Para poder usar AsyncTask debemos de extender una nueva clase con todas las características de AsyncTask e implementar los métodos correspondientes para la ejecución en segundo plano y la publicación de resultados en el UI Thread.
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); // Escape early if cancel() is called if (isCancelled()) break; } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } }
Ejecución
new DownloadFilesTask().execute(url1, url2, url3);
Tipos genéricos de AsyncTask
Los tres tipos utilizados por una tarea asíncrona son los siguientes:- Params El tipo de parámetros enviados a la tarea en ejecución.
- Progreso El tipo de unidades de progreso mostradas durante el background de la computación.
- Resultado El tipo de resultado del cálculo de background.
No todos los tipos son siempre utilizados por una tarea asíncrona. Para marcar un tipo como no utilizado, simplemente utilice el tipo Void:
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
The 4 steps
Cuando se ejecuta una tarea asincrona, la tarea pasa por 4 pasos:
- onPreExecute() Invocado en el UI thread antes de que la tarea sea ejecutada. Este paso es normalmente usado para preparar la tarea, por ejemplo, para mostrar una barra de progreso en la interfaz de usuario.
- doInBackground(Params...) Invocado en el subproceso de fondo inmediatamente después de que onPreExecute () termine de ejecutarse. Este paso se utiliza para realizar cálculos de fondo que pueden tardar mucho tiempo. Los parámetros de la tarea asincrónica se pasan a este paso. El resultado del cálculo debe ser devuelto por este paso y se pasará de nuevo al último paso. Este paso también puede usar publishProgress (Progress ...) para publicar una o más unidades de progreso. Estos valores se publican en el subproceso de UI, en el paso onProgressUpdate (Progreso ...).
- onProgressUpdate(Progress...) Invocado en el subproceso de interfaz de usuario después de una llamada a publishProgress (Progreso ...). La temporización de la ejecución no está definida. Este método se utiliza para mostrar cualquier forma de progreso en la interfaz de usuario mientras se está ejecutando la computación de fondo. Por ejemplo, se puede utilizar para animar una barra de progreso o mostrar registros en un campo de texto.
- onPostExecute(Result) Invocada en el subproceso de interfaz de usuario después de finalizar el cálculo de fondo. El resultado del cálculo de fondo se pasa a este paso como un parámetro.
Cancelación de una tarea
Se puede cancelar una tarea en cualquier momento invocando cancel (boolean). Invocar este método hará que las llamadas posteriores a isCancelled () devuelvan true. Después de invocar este método, onCancelled (Object), en lugar de onPostExecute (Object) será invocado después de doInBackground (Object []) devuelve. Para asegurar que una tarea se cancele lo más rápidamente posible, siempre debe comprobar periódicamente el valor devuelto de isCancelled () desde doInBackground (Object []), si es posible (dentro de un bucle por ejemplo).
Reglas de segmentación
Hay algunas reglas de subprocesamiento que se deben seguir para que esta clase funcione correctamente:
- La clase AsyncTask debe cargarse en el subproceso de la interfaz de usuario. Esto se realiza automáticamente a partir de JELLY_BEAN.
- La instancia de tarea debe crearse en el subproceso de la interfaz de usuario.
- execute (Params ...) debe ser invocado en el subproceso de UI.
- No llame a onPreExecute (), onPostExecute (Resultado), doInBackground (Params ...), onProgressUpdate (Progreso ...) manualmente.
- La tarea se puede ejecutar sólo una vez (se producirá una excepción si se intenta una segunda ejecución).
Orden de ejecución
Cuando se introduce por primera vez, AsyncTasks se ejecutaron en serie en un solo hilo de fondo. Comenzando con DONUT, esto fue cambiado a un grupo de hilos permitiendo que múltiples tareas funcionaran en paralelo. Comenzando con HONEYCOMB, las tareas se ejecutan en un solo hilo para evitar errores comunes de aplicación causados por la ejecución en paralelo.
Imagen
GitHub
Proyecto con AsyncTaskFuentes
android developer
hermosaprogramacion
http://www.sgoliver.net
sekthdroid.wordpress.com
Comentarios
Publicar un comentario