Con esta entrada empezaré una serie de publicaciones donde mostraré como podemos realizar peticiones HTTP con nuestro dispositivo Android. Para esta práctica estaremos usando la Clase AsyncTask la cual viene en Android desde la API #3. 
AsyncTask nos permite usar facilmente el thread UI (hilo de la interfaz de usuario). Con esta clase podemos ejecutar operaciones en segundo plano y mostrar los resultados en el hilo UI sin tener que manipular hilos en el SO de forma manual.
AsyncTask es ideal para realizar operaciones cortas (de unos pocos segundos). Si necesitas tener hilos durante largos periodos de tiempo en ejecución, se recomienda hacer uso de varias APIS proveidas por el paquete java.util.concurrent tales como Executor, ThreadPoolExecutor y FutureTask.
Una tarea asíncrona se define como un proceso que correo sobre un hilo secundario el cual muestra su resultado sobre el hilo UI o hilo principal. Las tareas asíncronas estan definidas por 3 tipos genericos: llamados Params, Progress y Result. Además consta de 4 pasos de ejecución: onPreExecute, doInBackground, onProgressUpdate y onPostExecute.
Los 3 tipos utilizados por la Clase AsyncTask son los siguientes:
  • Params: Son el tipo de parametro a enviar al poner en marcha la ejecución.
  • Progress: El tipo de unidades de progreso publicadas durante la ejecución de la misma.
  • Result: El tipo del resultado del proceso ejecutado.
No todos los tipos son siempre utilizados al ejecutar una tarea asíncrona, sino utilizaras alguno simplemente se define como Void.
Los 4 etapas de una tarea asíncrona:
onPreExecute(), se invoca sobre el hilo principal antes de ejecutar la tarea misma. En esta etapa se utiliza comúnmente para preparar la tarea, por ejemplo para mostrar la barra de progreso en la interfaz del usuario.
doInBackground(Params…), se invoca en el hilo secundario inmediatamente después de que el método onPreExecute() termino de ejecutarse. Esta etapa es utilizada para ejecutar procesos que pueden llevar mucho tiempo. Los parámetros de la tarea asíncrona son recibidos aquí. El resultado del proceso debe ser retornado desde esta etapa y este será enviado a la última etapa (onPostExecute()). Cabe recalcar que doInBackground() puede hacer uso del método publishProgress(Progress…) para mostrar una o más unidades de progreso. Estos valores son mostrados sobre el hilo principal, en la etapa de ejecución de onProgressUpdate(Progress…).
onProgressUpdate(Progress…) se invoca sobre el hilo principal después y se pone en ejecución al llamar al método publishProgress(Progress…). El tiempo de ejecución es indefinido. Este método es utilizado para desplegar cualquier formulario de progreso en la interfaz del usuario mientras que el proceso en segundo plano se sigue ejecutando. Por ejemplo, puede ser usado para animar una barra de progreso o mostrar avances en un campo de texto.
onPostExecute(Result), se invoca sobre el hilo principal después de que el proceso en segundo plano ha finalizado. El resultado del proceso es enviado a esta etapa como un parámetro.
Cancelar la ejecución una tarea asíncrona:
Una tarea asíncrona puede ser cancelada en cualquier momento con solo invocar cancel(boolean). Invocar este método causará que la llamada al método isCancelled() retorne true. Después de invocar este método, onCancelled(Object) se invocará al finalizar doInBackground(Object[]) y no el método onPostExecute() como ocurriría normalmente si la tarea no hubiese sido cancelada. Ahora para asegurarse de que una tarea ha sido cancelada, siempre debes revisar el valor que retorna el método isCancelled() periódicamente desde dentro del método doInBackground(Object[]), si es posible (utilizando un loop por ejemplo).
Debes seguir las siguientes reglas de ejecución para que para que la clase AsyncTask funciona de forma correcta:
  • La clase AsyncTask debe ser llamada desde el hilo principal. Se hace de forma automática desde Jelly Bean.
  • La instancia de AsyncTask debe ser creada sobre el hilo principal.
  • execute(Params…) debe ser invocada desde el hilo principal.
  • No debes llamar a los métodos onPreExecute(), onPostExecute(Result), doInBackground(Params…) ó onProgressUpdate() de forma manual.
  • La tarea solo puede ser ejecutada una vez y mientras dure su ejecución (Se lanzará una excepción si la instancia es ejecutada más de una vez).

En construcción….

AsyncTask documentación oficial: https://developer.android.com/reference/android/os/AsyncTask.html

Leave a Reply