Sei sulla pagina 1di 5

Tareas Asncronas

Tarea

Corts Vargaz Sandra Alejandra

ITSUR Programacin Mvil II 27/01/2014

Una tarea asncrona es bsicamente algo que se ejecuta en segundo plano mientras la aplicacin se est ejecutando, digamos que tenemos un proceso oculto que puede ejecutar cdigo sin necesidad de que nosotros tengamos que parar el proceso principal, en este caso la interfaz usuario en Android. Algunos ejemplos de esto sera conectarnos a Internet, bajar un cliente RSS o feed RSS. En determinadas ocasiones, tenemos programas que tardan bastante rato en realizar una tarea en concreto y queremos que esta no bloquee la aplicacin mientras se est ejecutando. Para solventar esto normalmente se hace uso de los Threads (hilos). Para ello, creamos un hilo adicional para nuestra tarea y continuamos con el hilo normal para el resto de la aplicacin. El problema es que la interfaz grfica (UI) de Android no permite llamadas desde otros hilos que no sea el suyo, as que si necesitamos realizar alguna actualizacin (aumentar barra de porcentaje, aadir informacin) nuestra aplicacin se cerrar. Para lanzar un hilo que realice tareas en segundo plano se suelen utilizar dos estrategias: usar los Thread propios de la API de Java, o bien la clase AsyncTask de Android que constituye una solucin ms simple y elegante. Tambin existen otras opciones ms especficas, como usar IntentService (servicio asncrono) o el Loader AsyncTaskLoader introducido en Honeycomb. Para usar AsyncTask, crearemos una clase interna en la que queramos realizar la tarea (podra ser una Activity, un Adapterlo imprescindible es que se cree e invoque dentro del UIThread) que herede ella. Extendiendo de AsyncTask (tarea asncrona) podemos crear una clase que tenga entre 1 y 4 mtodos segn necesitemos. Adems, la clase AsyncTask dispone de tres tipos de parmetros distintos, que

tendremos que especificar cundo declaremos nuestra clase. Veamos un ejemplo:

Los tres parmetros son los siguientes: Params: Datos que pasaremos al comenzar la tarea. Progress: Parmetros que necesitaremos para actualizar la UI. Result: Dato que devolveremos una vez terminada la tarea.

Al ejecutarla, se invocarn secuencialmente los siguientes mtodos que podemos sobre escribir si lo necesitamos: onPreExecute:Tiene acceso al UI thread y nos permite, por ejemplo, mostrar un ProgressDialog doInBackground: Es donde se realizar la tarea que queremos realizar en segundo plano. No tenemos acceso a la interfaz grfica, pero se puede invocar publishProgress por si queremos actualizar el status de un ProgressDialog. onProgressUpdate: Es llamado por publishProgress desde doInBackground para que podamos informar al usuario del progreso de la tarea onPostExecute: Se invoca una vez haya terminado doInBackground y se utiliza para actualizar la interfaz grfica tras haberse obtenido (o no) los datos recuperados en segundo plano.

Ejemplo Quiero crear una aplicacin que descargue un archivo de internet. A la tarea le pasar la direccin del fichero (String), conforme vaya descargndolo ir mostrando el porcentaje que lleva (Float) y una vez terminado devolver el nmero

de bytes del fichero (Integer). Nuestra instancia quedara as: Si alguno de los parmetros no lo necesitamos, podremos substituirlo por Void. Los mtodos que tendremos que escribir de nuestra clase son los siguientes, aunque solo es obligatorio el primero:

Este mtodo ser el encargado de realizar la tarea en segundo plano. Como vemos, recibe un nmero cualquiera de parmetros del tipo Params, as que debemos tratar a p como un array. Este mtodo se ejecuta en otro hilo, por lo que no podremos modificar la UI

desde l. Para ello, usaremos los tres mtodos siguientes. Este mtodo se ejecutar antes de doInBackground, por lo que podremos modificar la interfaz para indicar el comienzo de la tarea (colocar un cargando, desactivar botones).

Este mtodo permitir actualizar la interfaz mientras se ejecuta la tarea asncrona. Para ello, desde doInBackground deberemos llamar a publishProgress y pasarle

los parmetros oportunos. Este ltimo mtodo, como habris supuesto, se ejecuta tras doInBackground y recibe como parmetro lo que este devuelva. Quizs ahora no lo tenis del todo claro, pero veamos el ejemplo anterior ya implementado. terminar

Potrebbero piacerti anche