Async Task

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 8

Tareas Asincronicas

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
threads​handlers​
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:

Etapas del AsyncTask


Cada vez que una tarea asíncrona se ejecuta, se pasa a través de 4
etapas:
.​
1. onPreExceute()​ UI thread​
Se invoca en el ​ inmediatamente
después de que la tarea es ejecutada. Este paso se utiliza
normalmente para configurar la tarea. El ejemplo básico es
ProgressBar​
cuando se muestra una ​ en la interfaz de usuario.
2. doInBackground(Params…). Se invoca en el subproceso en
segundo plano inmediatamente después de que
onPreExecute() ​
termina de ejecutarse. En esta etapa se
calcula el tiempo estimado que tomará la realización de la
tarea, que deberá pasarse a la última etapa de todo el
proceso. Los parámetros de la tarea asíncrona también se
pasan en esta etapa. Dentro de esta etapa podemos utilizar el
publishProgress(Progress…)​
método ​ para publicar una o más
UI thread​
unidades de progreso en el ​ por la ayuda de la
onProgressUpdate(Progress…)​
siguiente etapa que es ​ .
.​
3. onProgressUpdate(Progress…)​Se invoca en el ​
UI thread
publishProgress(Progress…)​
después de una llamada a ​ . El
momento de la ejecución es indefinido. Este método es
utilizado para mostrar cualquier tipo de progreso en la interfaz
de usuario mientras la tarea en segundo plano sigue
ejecutándose.
UI thread​
4. onPostExecute(Result…). Se invoca en el ​ después
de que el proceso en segundo plano ha sido terminado. El
resultado devuelto por todo el proceso se pasa a este método
como parámetro.

Las reglas del juego


AsyncTask​
Para poder trabajar sin problemas con la clase ​ , existen
threads​
algunas reglas acerca de los ​ que debes tomar en cuenta:
UI thread​
● La instancia de la tarea debe crearse en el ​ .
execute(Params…)​
● El método ​ UI thread​
debe invocarse en el ​ .
● Los métodos ​
onPreExecute(), onPostExecute(Result),
doInBackground(Params…), on ProgressUpdate(Progress…)
no deben llamarse de forma manual.
● La tarea debe ser ejecutada sólo una vez (con excepción de
que la ejecución corresponda a un segundo intento).

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;

5 /** Called when the activity is first created. */

6 ​
@Override

7 public void onCreate(Bundle savedInstanceState) {

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

16 public void onClick(View arg0){

17 button.setClickable(false);

18 new UpdateProgress().execute();

19 }

20 });

21 }

22 //...Definición de la clase interna

23 }

Recuperamos las referencias al botón y a la barra de progreso


OnClickListener​
mediante sus id’s. Agregamos un evento de tipo ​ en
el botón, que hará que no pueda presionarse nuevamente hasta que
el proceso en segundo plano finalice y que ejecutará el método
execute()​ UpdateProgress​
desde un objeto anónimo de ​ que
acabamos de explicar.
4. Ahora corremos nuestro ejemplo y este es básicamente el flujo
que veremos en la aplicación:
Se carga la interfaz gráfica de nuestra actividad.

Se inicia el proceso en segundo plano.

Termina el proceso en segundo plano y ahora podemos presionar


nuevamente nuestro botón.

También podría gustarte