Android AsyncTask

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

El AsyncTask

Hola alumnos del curso Programación Android! Hoy vamos a ver cómo trabajar con la clase AsyncTask .
Motivación: Android modifica la interfaz de usuario a través de un hilo, el hilo de interfaz de usuario
de dicha. Si se realiza una operación de larga ejecución directamente en el subproceso de interfaz de
usuario, por ejemplo, descargar un archivo desde Internet, la interfaz de usuario de su
aplicación se "congelará" hasta que la tarea ha terminado correspondiente.
Cuando esto sucede es muy fácil para el usuario perciba un retraso, y quiera cerrar la aplicación.

Como su nombre lo indica, un AsyncTask se puede realizar en tareas de forma asincrónica, como la clase Thread. La
ventaja de AsyncTask es su facilidad de uso e implementación. Se crea automáticamente y la comunicación entre los
diferentes subprocesos se simplifica. Al desarrollar una aplicación, hay que tener en cuenta que todas las tareas de
uso intensivo de CPU (pedidos HTTP, cálculos pesados, ...) deben estar en un hilo separado.

¿Qué hace AsyncTask? AsyncTask permite el uso fácil y adecuado del hilo la interfaz de usuario. Esta clase permite
realizar operaciones en segundo plano y publicar los resultados en el subproceso de interfaz de usuario sin
necesidad de manejar hilos y/o manipuladores de hilos(threads).

De hecho, el sistema muestra un mensaje de error y se cierra la aplicación cuando el hilo principal está bloqueado
por mucho tiempo:

Creación de un proyecto

Así que lo primero que vamos a crear es un nuevo proyecto llamado AsyncGranCalculo. Así nos aseguraremos de
tener una Actividad lista para hacer un proceso largo , de forma asincrónica.
En primer lugar, vamos a modificar el diseño main.xml mediante la creación de un botón y un ProgressBar. El
primero arranca la tarea y el segundo va a mostrar
el progreso del tratamiento. Aquí está el XML:

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<Button
android:layout_marginTop="10dp"
android:id="@+id/btnLaunch" android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Ejecutar la tarea" />

<TextView
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:text="El progreso de la tarea asincrónica:" />

<ProgressBar
android:id="@+id/pBAsync"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent" android:layout_margin="10dp"
android:layout_height="wrap_content" />

</LinearLayout>

La actividad principal

En primer lugar, podrán recuperar los componentes definidos en el diseño y luego agregar un detector en el botón,
de modo que en cada click
se ejecuta una nueva instancia de GranCalculo. Hasta el momento, nada complicado de nuevo, así que acá el código:

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;

public class AsyncGranCalculo extends Activity {

private ProgressBar mProgressBar;


private Button mButton;

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


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//tomamos los componentes de nuestro diseño


mProgressBar = (ProgressBar) findViewById(R.id.pBAsync);
mButton = (Button) findViewById(R.id.btnLaunch);

//agregamos un Listener a nuestro boton


mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
GranCalculo calcul=new GranCalculo();
calcul.execute();
}
});
}

Clase GranCalculo

A continuación, realizamos la escritura de nuestra clase BigCalcul, que hereda AsyncTask. Aquí lo pongo en la clase
privada, pero es posible escribir por separado.
Les dejo ver (y tratar de entender) el código:

private class GranCalculo extends AsyncTask<Void, Integer, Void> {

private static final int ITERACION_CORTA = 100;


private static final int ITERACION_LARGA = 1000000;

@Override
protected void onPreExecute() {
super.onPreExecute();
Toast.makeText(getApplicationContext(), "Empezando el procesamiento asincrónico",
Toast.LENGTH_LONG).show();
}

@Override
protected void onProgressUpdate(Integer... values){
super.onProgressUpdate(values);
//actualizamos el ProgressBar
mProgressBar.setProgress(values[0]);
}
@Override
protected Void doInBackground(Void... arg0) {

int progress;
for (progress=0;progress<=ITERACION_CORTA;progress++) {
for (int i=0; i<ITERACION_LARGA; i++){}
// el Metodo publishProgress es para las actualizaciones de la interfaz , y va a invocar el
metodo onProgressUpdate
publishProgress(progress);
progress++;
}
return null;
}

@Override
protected void onPostExecute(Void result) {
Toast.makeText(getApplicationContext(), "Terminando el procesamiento asincrónico",
Toast.LENGTH_LONG).show();
}
}

Explicaciones:
Los tres parámetros se espera cuando se declaran los tipos genéricos, tienen los siguientes significados:
-El primero es el tipo de parámetros pasados a la tarea
-El segundo es el tipo de datos transmitidos durante el progreso del tratamiento
-Por último, el tercero es el tipo de resultado de la tarea

Un AsyncTask debe implementar el método doInBackground . Es este método el que va a realizar el procesamiento
de forma asincrónica en un subproceso independiente.
Los métodos OnPreExecute (llamado antes del tratamiento), onProgressUpdate (llamadocuando desea mostrar su
progreso) y OnPostExecute (llamado después del tratamiento) son opcionales.
Una llamada al método publishProgress permite la actualización de los avances. No hay que llamar al método
directamente onProgressUpdate.
NOTA: Tengan en cuenta que estos tres métodos (OnPreExecute y OnPostExecute onProgressUpdate) se ejecutan
desde la interfaz de usuario, es todo un tema!

Si lo ejecutamos, nos dará esto:


El código parece bastante claro. Usted acaba de notar que la llamada GranCalculo es en realidad un bucle grande,
solo para entender què podemos hacer por detrás.
Bueno, espero que AsyncTask no les complique la vida, ya que como ven no tiene grandes secretos! No duden en
hacerme preguntas si tiene alguna dificultad en su aplicación.
El código fuente del ejemplo está disponible en este email.

También podría gustarte