Sei sulla pagina 1di 17

Ejemplos AsyncTask.

Ejemplos AsyncTask.
Segn el sitio oficial de Android Developers, los AsyncTask nos permiten un uso propio y facil del hilo de la UI. Esta clase nos
permite realizar procesos en background y publicar estos resultados en el hilo principal sin tener que manipular hilos o handlers.
Para utilizar las AsyncTasks, hay que crear una nueva clase que extienda la clase AsyncTask.
public class myDownloadTask extends AsyncTask<Params, Progress, Result> {
Una tarea asncrona se define con 3 tipos genricos, llamados:
Params. El tipo de dato que se pasa como parmetro a la clase, en concreto al mtodo doInBackground.
Progress. El tipo de datos utilizado para publicar el avance de la tarea en ejecucin. Se utiliza en el mtodo
onProgressUpdate (en una barra de progreso horizontal, por ejemplo).
Result. El tipo de datos utilizado para publicar el resultado a la interfaz, se transmitir al mtodo onPostExecute a travs
del mtodo doInBackground
, y de 4 mtodos:
onPreExecute. este mtodo le permite actualizar la interfaz de su aplicacin antes de empezar a ejecutar la tarea en
segundo plano. Este mtodo se ejecuta en el UI Thread.
doInBackground. este mtodo se ejecuta en un thread separado, lo que le permite ejecutar un tratamiento pesado en una
tarea de segundo plano.
onProgressUpdate. este mtodo le permite actualizar el progreso de la tarea en ejecucin. Se invoca gracias a la funcin
publishProgress.
onPostExecute. este mtodo permite actualizar la interfaz con el resultado obtenido al final del tratamiento ejecutado en el
mtodo doInBackground.

Para comprender mejor este componente, cree un proyecto Android que tenga un botn. Un clic en este botn provocar la
simulacin de un tratamiento en una AsyncTask.
El progreso del tratamiento se indica mediante una barra de progreso horizontal.
La interfaz se compondr de dos elementos:
Un botn.
Una barra de progreso: tiene un estilo horizontal y est oculta por defecto (atributo visibility), el objetivo es mostrarla
durante el tratamiento.
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button android:text="@string/launch_async"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/launch_async"
android:layout_gravity="center_horizontal"
android:layout_margin="10sp"/>
<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
android:id="@+id/progress"

1 de 17

Ejemplos AsyncTask.

android:layout_height="wrap_content"
android:layout_width="match_parent"
android:visibility="gone"
android:layout_margin="10sp"/>
</FrameLayout>
Ahora, crea una clase que herede de la clase AsyncTask.
public class myDownloadTask extends AsyncTask<String, Integer,String> {
......
}
Puede utilizar Void como tipo de datos si no desea utilizar datos en el parmetro (en alguno de los tres tipos definidos durante la
creacin de una AsyncTask).
Seguidamente, implementa el mtodo onPreExecute para ocultar el botn y mostrar la barra de progreso.

@Override
protected void onPreExecute() {
super.onPreExecute();
launchAsync.setVisibility(View.GONE);
progress.setVisibility(View.VISIBLE);
}
A continuacin, implemente el mtodo doInBackground:
@Override
protected String doInBackground(String... params) {
String uri = params[0];
String result = "";
for (int i = 1; i <= 10; ++i) {
try {
Thread.sleep(1000L);
}
catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(i * 10);
result += i;
}
return result;
}
Este mtodo recibe como parmetro una tabla sin acotar de cadenas de caracteres (tipo elegido en la sobrecarga de la
clase AsyncTask).
Se realiza la simulacin de un tratamiento pesado mediante un bucle que recorre del 1 al 10. Con cada iteracin se detiene
el thread durante 1 segundo y, a continuacin, se publica el grado de avance del tratamiento (se aumenta de 10 en 10 en
cada iteracin).
Para finalizar, hay que devolver el resultado al mtodo onPostExecute.
La llamada al mtodo publishProgress provoca la ejecucin del mtodo onProgressUpdate.
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
AsyncTaskActivity.this.progress.setProgress(progress[0]);
}
Este mtodo permite definir el grado de progreso actualizando la barra de progreso.

2 de 17

Ejemplos AsyncTask.

Ahora, implementa el mtodo onPostExecute que, en este ejemplo, sirve para mostrar un Toast indicando la finalizacin de la
tarea en segundo plano as como para ocultar la barra de progreso y mostrar el botn.
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Toast.makeText(AsyncTaskActivity.this, "Finalizacin del
tratamiento en segundo plano", Toast.LENGTH_LONG).show();
launchAsync.setVisibility(View.VISIBLE);
progress.setVisibility(View.GONE);
}

En lo concerniente a las AsyncTasks, debemos recordar los siguientes puntos:


Slo el mtodo doInBackground es el que no se ejecuta en el UI Thread.
Las AsyncTasks no persisten si se mata la actividad, tras un cambio de orientacin del dispositivo, por ejemplo.
Su uso es ideal para tratamientos cortos.
Una AsyncTask no puede ejecutarse hasta que la ejecucin anterior finalice.
El tipo Void evita el uso de uno de los tipos de datos definidos en la sobrecarga de una AsyncTask.
La ejecucin de la AsyncTask se realiza mediante el mtodo execute:
downloadTask = new myDownloadTask();
downloadTask.execute(uri);

3 de 17

Ejemplos AsyncTask.

Como usar una AsyncTask para cargar elementos en un


ListView.
Veremos un poco en que consisten este tipo de tareas y que contienen, vamos a usar el Ejemplo ListView Bsico para editarlo y
agregarle la AsyncTask.

MainActivity

package com.example.ejemplolistview;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView list;
private String[] sistemas = {"Ubuntu", "Android", "iOS", "Windows", "Mac OSX", "Google Chrome OS", "Debian", "Mandriva",
"Solaris", "Unix"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = (ListView)findViewById(R.id.listview);
ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, sistemas);
list.setAdapter(adaptador);
list.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "Ha pulsado el item " + position, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}

4 de 17

Ejemplos AsyncTask.

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/listview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>

5 de 17

Ejemplos AsyncTask.

Crear el proyecto.
Para empezar crearemos un nuevo Proyecto en Android.

6 de 17

Ejemplos AsyncTask.

Hasta aqu no hay nada que no sepamos, creamos un proyecto con unos datos bsicos, nombre de actividad, etc.

7 de 17

Ejemplos AsyncTask.

Ejemplo ListView Bsico.


A continuacin editamos el archivo xml de la actividad para que quede as:

Con este layout, nos debe de quedar as:

A continuacin nos vamos al cdigo java de nuestra clase:

8 de 17

Ejemplos AsyncTask.

9 de 17

Ejemplos AsyncTask.

AsyncTask.
Ahora es donde crearemos nuestra AsyncTask, dentro de la clase de nuestra actividad:
private class CargarListView extends AsyncTask<Void, Void, ArrayAdapter<String>>{
Context context;
ProgressDialog pDialog;
public CargarListView(Context context){
this.context = context;
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pDialog = new ProgressDialog(context);
pDialog.setMessage("Cargando Lista");
pDialog.setCancelable(true);
pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pDialog.show();
}
@Override
protected ArrayAdapter<String> doInBackground(Void... arg0) {
// TODO Auto-generated method stub
try{
Thread.sleep(2000);
}catch(Exception ex){
ex.printStackTrace();
}
ArrayAdapter<String> adaptador = new ArrayAdapter<String>(context,
android.R.layout.simple_list_item_1, sistemas);
return adaptador;
}
@Override
protected void onPostExecute(ArrayAdapter<String> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
list.setAdapter(result);
pDialog.dismiss();
}
}

Esta clase pertenece a la AsyncTask, (AsyncTask<Void, Void, ArrayAdapter<String>>) y como tipo genrico:
tenemos Void (doInBackground no recibe nada),
Void (no actualizamos el progreso de la tarea)

10 de 17

Ejemplos AsyncTask.

ArrayAdapter, que es el tipo de dato que retorna el mtodo doInBackground.


Tenemos como variables de instancia de la clase un ProgressDialog, el cual mostrar un dilogo con un Spinner y el mensaje de
Cargando Lista, todo ello para que el usuario vea que nuestra aplicacin no ha fallado, sino que est procesando algo.
En el mtodo doInBackground tenemos el proceso que se elabora en segundo plano, en este caso hemos hecho que espere 1
segundo, para que podamos ver el ProgressDialog en funcionamiento. Tras esto, se crea el ArrayAdapter y lo retorna.
En el ltimo mtodo, onPostExecute, recibe el adaptador y lo aplica a la lista. En este mtodo es donde se actualizan los
elementos del hilo principal, ya que es el que se activa una vez se ha hecho todo el procesamiento. Tras establecer el adaptador
en la ListView, quitamos el ProgressDialog.

11 de 17

Ejemplos AsyncTask.

Descarga de imgenes.
Veremos como podemos bajar una imagen para mostrarla en nuestro Android, mediante una simple funcin.
Cuando creamos aplicaciones, podemos encontrarnos en la necesidad de tener que bajar imgenes y tener que mostrarlas luego
en un ImageView, y a partir de la versin 3.X de Android, cualquier operacin que requiera el uso de Internet debe ir en otro hilo
aparte, no puede ir en el hilo principal de la aplicacin, es por eso por lo que tendremos que usar un AsyncTask para usar la red
de nuestro dispositivo.

GUI
Una vez creado nuestro proyecto en Android, vamos a modificar el xml de la actividad, con lo que nos quedar algo as:

Con este xml tendremos un elemento ImageView que estar posicionado en el centro de nuestra pantalla.

12 de 17

Ejemplos AsyncTask.

Activity
Aqu viene la parte importante de nuestro ejemplo, ya que toda la funcionalidad principal se desarrolla aqu.
Vamos a empezar declarando una constante, la cual contendr la url de una imagen, yo he cogido una del buscador de Google,
podeis usar cualquiera que est alojada en la red. A continuacin, tenemos la variable de instancia del ImageView, en el cual
pondremos la imagen descargada.

Mtodo onCreate()
En este mtodo inicializaremos el ImageView, y llamaremos a la AsyncTask, la cual descargar la imagen y la establecer en el
ImageView.

En este punto nuestra aplicacin an no ser funcional, ya que no tenemos creada la AsyncTask, la cual yo he llamado
CargarImagenes, pero cualquier otro nombre valdra.

13 de 17

Ejemplos AsyncTask.

AsyncTask CargaImagenes
Aqu viene una de las partes principales de nuestra aplicacin, ser la tarea que se encargue de bajar la imagen y establecerla en
el ImageView, y todo esto se realiza en segundo plano mientras muestra un ProgressDialog, para que el usuario sepa que nuestra
aplicacin no ha explotado.

Como vemos, la AsyncTask tiene un ProgressDialog, el cual es inicializado y lanzado en el mtodo onPreExecute(), el cual es
llamado automticamente antes de empezar el mtodo doInBackground().
En el mtodo doInBackground() se realiza la funcionalidad principal de la aplicacin. Primero cogemos el parmetro de la lista de
parmetros, en este caso es param[0], porque solo hemos pasado uno, y este se encuentra en la posicin 0, como si de un Array
se tratase.
Luego definimos un objeto de la clase Bitmap, que ser el encargado de guardar la imagen.

14 de 17

Ejemplos AsyncTask.

Mtodo descargarImagen()
Este mtodo es simple, es el siguiente:

En este mtodo recibimos la url de la imagen a descargar, el cual pasaremos mas tarde como argumento para crear una nueva
instancia de la clase URL.
Por ltimo, en el mtodo onPostExecute(), el cual se inicia al terminar el mtodo doInBackground(), y en este es donde
podremos interactuar con el hilo principal de la aplicacin, por tanto quitaremos el ProgressDialog, con lo cual el usuario ver que
la tarea habr terminado, y a continuacin con el mtodo setImageBitmap(), establecemos la imagen en el ImageView.

15 de 17

Ejemplos AsyncTask.

AndroidManifest.xml
Nada funcionar en nuestra aplicacin si no aadimos una linea en nuestro AndroidManifest.xml. Es simple, en nuestra
aplicacin estamos usando Internet para descargar una imagen, y es un permiso que tenemos que declarar. Para ello, nos iremos
al directorio raiz de nuestro proyecto y abriremos el archivo AndroidManifest.xml.
Pinchamos en la ltima pestaa que vemos en la parte inferior de la ventana, la cual se llama AndroidManifest.xml, y aadimos la
linea correspondiente, con lo cual quedar as:

Con esta lnea nuestra aplicacin podr usar internet para realizar acciones que tengan que ver con ello.
Con esto nuestra aplicacin es finalmente funcional, y podemos ver que al abrirla se nos carga la imagen. A continuacin dejo una
foto y un video de como es en funcionamiento.

16 de 17

Ejemplos AsyncTask.

17 de 17

Potrebbero piacerti anche