Async Task
Async Task
Async Task
AsyncTask
La clase nos ayuda a los desarrolladores a darle un uso
UI thread
adecuado y más fácil al de nuestras aplicaciones. Permite
ejecutar operaciones en segundo plano y definir los resultados en
UI thread
el sin tener que rompernos la cabeza manipulando
threadshandlers
y .
AsyncTask
Para utilizar debemos:
AsyncTask
● Crear una subclase de , comúnmente como una
clase interna privada dentro de la actividad en la que estemos
trabajando.
AsyncTask
● Sobreescribir uno o más métodos de para poder
realizar el trabajo en segundo plano, además de cualquier otra
tarea asociada para poder mostrar alguna actualización en el
UI thread
.
AsyncTask
● Cuando sea necesario, crear una instancia de y
execute()
llamar al método para que empiece a realizar su
trabajo.
Tipos genéricos
AsyncTask
utiliza
tipos genéricos
, por lo que resulta necesario
definir tres tipos de datos cada vez que necesitemos crear una
instancia de esta clase:
● Parámetros (Params). El tipo de información que se necesita
para procesar la tarea.
● Progreso (Progress). El tipo de información que se pasa
dentro de la tarea para indicar su progreso.
● Resultado (Result). El tipo de información que se pasa cuando
la tarea ha sido completada.
Hay que tener en cuenta que existen casos en los que algún tipo
AsyncTask
genérico no es utilizado por la , para ello utilizamos el
Void
tipo como se muestra a continuación:
El ejemplo
Habiendo entendido la parte teórica del asunto, es hora de saltar a
la parte divertida: el código. En esta ocasión vamos a crear un
ejemplo que muestre un botón que al ser presionado detone una
tarea en segundo plano para actualizar el progreso en una
ProgressBar
. ¿Listo?
AsyncTaskTest
1. Creamos un nuevo proyecto llamado con la
versión Android 2.3 como minimo..
main.xml
2. Modificamos el archivo para agregar un botón que
“Go AsyncTask!”
muestre el texto ProgressBar
y una con un estilo
de barra horizontal. A continuación el código que deberás escribir:
ProgressBar
En la definición de la además de indicar el estilo con el
que se mostrará, indicamos el valor máximo que alcanzará la barra
android:max
( ) y el progreso que se mostrará cuando arranque la
android:progress
aplicación ( ).
3. Ahora pasemos a escribir el código que irá dentro de la actividad
principal de la aplicación. Primero, agregamos las sentencias
import
de las clases que utilizaremos en el ejemplo:
1 import android.app.Activity;
2 import android.os.Bundle;
3 import android.widget.ProgressBar;
4 import android.os.AsyncTask;
5 import android.os.SystemClock;
6 import android.view.View;
7 import android.widget.Button;
AsyncTask
Después, definimos una subclase de que es una clase
interna de la actividad principal; es decir, el siguiente código deberá
ir dentro de las llaves que abren y cierran la definición de
AsyncTaskTestActivity
(en mi caso).
Como puedes ver, aquí aplicamos el uso de los tipos genéricos
explicados en la parte teórica de crear la clase interna que he
UpdateProgress
llamado . Para que todo marche bien, es necesario
implementar los cuatro métodos que corresponden a las 4 etapas
también comentadas líneas arriba.
1. onPreExecute(). Definimos el progreso de la barra en 0 para
empezar.
2. doInBackground(). En este método definimos la forma en la
ProgressBar
que estará avanzando la , para lo cual nos
SystemClock
auxiliamos de la clase ,
y para cada vez que
progress
nuestra variable aumente se actualice su avance en
UI thread
el .
ProgressBar
3. onProgressUpdate(). Actualiza la .
4. onPostExecute(). Una vez que el proceso haya terminado, el
botón podrá ser presionado nuevamente después de cambiar
su atributo clickable.
Por último, escribimos el código que irá dentro de la actividad y
onCreate()
más específicamente, en el método :
1 public class AsyncTaskTestActivity extends Activity {
3 Button button;
4 ProgressBar progressBar;
6
@Override
8 super.onCreate(savedInstanceState);
9 setContentView(R.layout.main);
10
11 button = (Button)findViewById(R.id.task);
12 progressBar = (ProgressBar)findViewById(R.id.progressbar);
13
14 button.setOnClickListener(new Button.OnClickListener(){
15 @Override
17 button.setClickable(false);
18 new UpdateProgress().execute();
19 }
20 });
21 }
23 }