Buenas tardes, en esta entrada veremos como usar una AsyncTask para cargar elementos en un ListView.
Para comenzar con el proceso, vamos a ver en que consisten las AsyncTask.
Según 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.
Se definen las tareas asíncronas como procesos que se ejecutan en otro hilo y cuyo resultado se muestra en el hilo principal. Una tarea asíncrona se define con 3 tipos genéricos, llamados Params, Progress y Result, y de 4 pasos, onPreExecute, doInBackground, onProgressUpdate y onPostExecute.
Explicado un poco en que consisten este tipo de tareas y que contienen, vamos a usar el Ejemplo ListView Básico para editarlo y agregarle la AsyncTask.
-
Para empezar crearemos un nuevo Proyecto en Android.
Hasta aquí no hay nada que no sepamos, creamos un proyecto con unos datos básicos, nombre de actividad, etc.
-
A continuación editamos el archivo xml de la actividad para que quede así:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tool" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <ListView android:id="@+id/listview" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout>
Con este layout, nos debe de quedar así:
-
A continuación nos vamos al código java de nuestra clase, donde los primeros pasos con casi idénticos al tutorial anterior:
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 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); list = (ListView)findViewById(R.id.listview); list.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> arg0, View arg1, int posicion, long arg3) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "Ha pulsado el elemento " + posicion, Toast.LENGTH_SHORT).show(); } }); }
-
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&lt;String&gt; 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, y como tipo genérico tenemos Void (doInBackground no recibe nada), Void (no actualizamos el progreso de la tarea) y ArrayAdapter, que es el tipo de dato que retorna el método doInBackground. Tenemos como variables de instancia de la clase un ProgressDialog, el cual mostrará un diálogo con un Spinner y el mensaje de “Cargando Lista”, todo ello para que el usuario vea que nuestra aplicación no ha fallado, sino que está procesando algo.
En el método 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 método, onPostExecute, recibe el adaptador y lo aplica a la lista. En este método 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.
Tras esto ya tendríamos nuestra AsyncTask trabajando para cargar una lista, aunque podemos usar esto de muchísimas maneras diferentes. A continuación vemos un video de como queda nuestra AsyncTask en funcionamiento:
Sin mas, espero que os sirva de algo, cualquier aporte y corrección son bienvenidos, saludos!!!
Pingback: AsyncTask en Service en Android « SekthDroid()