Android AsyncTask
Android AsyncTask
Android 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:
<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;
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:
@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!