El objetivo de éste tutorial es implementar una Actividad que podamos aprovechar al realizar una carga de datos donde el usuario tenga que esperar en nuestras aplicaciones. En el ejemplo no realizaremos una carga real, sólo crearemos una pequeña secuencia donde un TextView muestre una carga de 0% a 100% y una vez completada la “carga” abriremos otra actividad.
Ésta técnica podremos utilizarla a partir del Android 1.5 (CupCake).
En primer lugar crearemos un nuevo proyecto llamado CargaDatos. Debemos de introducir un nombre de paquete válido e indicar la versión mínima de Android que soporta nuestra aplicación.
El asistente nos ayuda a crear la primera Activity que llamaremos CargaActivity que tendrá un layoutactivity_carga.xml asociado. Ésta actividad será la encargada de mostrar un TextView con la cuenta de 0 a 100 de la carga. Todo ésto mediante una clase Asynctask.
En total implementaremos dos Activitys y dos ficheros layout xml. Cuando acabe la carga de CargaActivity abrirá MainActivity.
- CargaActivity.java
- MainActivity.java
- activity_carga.xml
- activity_main.xml
En primer lugar declararemos las actividades en el AndroidManifest.xml
<manifest package="com.example.cargadatos" android_versionCode="1" android_versionName="1.0" > <uses-sdk android_minSdkVersion="8" android_targetSdkVersion="15" /> <application android_icon="@drawable/logoimaginaformacion" android_label="@string/app_name" android_theme="@style/AppTheme" > <activity android_name=".CargaActivity" android_label="@string/title_activity_carga" > <intent-filter> <action android_name="android.intent.action.MAIN" /> <category android_name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android_name=".MainActivity" android_label="@string/title_activity_main" /> </application></manifest>
Abriremos el fichero string.xml localizado dentro de res/values/string.xml y lo modificaremos.
<resources> <string name="app_name">CargaDatos</string> <string name="menu_settings">CargaDatos</string> <string name="title_activity_carga">CargaActivity</string> <string name="title_activity_main">MainActivity</string> <string name="saludo">Bienvenido</string></resources>
Ahora definiremos los ficheros visuales. Podremos ver el logotipo de Imagina Group en el centro de la actividad y un TextView justo debajo de la imagen y un ProgressBar.
Descargaros la imagen y renombradla como logoimaginaformacion.png y guardarla en la carpeta drawable-mdpi.
activity_carga.xml
package com.example.cargadatos;import android.app.Activity;import android.os.Bundle;public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }}
La actividad CargaDatos es más compleja por el uso del Asynctask.
CargaActivity.java
package com.example.cargadatos;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.graphics.Color;import android.os.AsyncTask;import android.os.Bundle;import android.widget.ProgressBar;import android.widget.TextView;public class CargaActivity extends Activity { TextView loadText; ProgressBar progressBar; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_carga); loadText = (TextView) findViewById(R.id.loadText); progressBar = (ProgressBar) findViewById(R.id.progressBar1); progressBar.setMax(100); progressBar.setBackgroundColor(Color.GRAY); progressBar.setProgress(0); AsyncTaskCargaDatos ATCargaDatos = new AsyncTaskCargaDatos(this); ATCargaDatos.execute(); } // // ASYNKTASCK // public class AsyncTaskCargaDatos extends AsyncTask<Void, Integer, Void> { Context mContext; AsyncTaskCargaDatos(Context context) { mContext = context; } @Override protected Void doInBackground(Void... params) { publishProgress(0); for (int i = 0; i < 100; i++) { try { Thread.sleep(50); publishProgress(i + 1); } catch (InterruptedException e) { e.printStackTrace(); } } return null; } @Override protected void onProgressUpdate(Integer... value) { loadText.setText(value[0] + " %"); progressBar.setProgress(value[0]); } @Override protected void onPostExecute(Void result) { mContext.startActivity(new Intent(mContext, MainActivity.class)); finish(); } }// fin asynctask}
AsyncTask es una clase que permite ejecutar procesos en background mientras la actividad funciona normalmente. AsyncTask está preparada para actualizar las interfaces de las Activitys. Se compone de una serie de hilos que tienen acceso a los métodos y objetos de la Activity que lo invoca.
Cuando implementamos esta clase, podemos sobrescribir 4 métodos los cuales están comunicados:
onPreExecute --> este código se ejecutará antes de doInBackground. El valor devuelto lo recibirá doInBackground.
doInBackground --> aquí realizaremos el trabajo "pesado" de la carga. Podemos parsear un fichero xml, cargar en memoria los gráficos de un juego, descargar de servidor la información necesaria, etc... El valor devuelto lo recibirá onPostExecute.
onProgressUpdate --> Proceso encargado de actualizar la interfaz de la actividad mientras doInBackGround sigue cargando. El método se ejecutará cada vez que doInBackGround ejecute el método publishProgress(param);.
Una vez esté todo preparado, podemos ejecutarlo y visualizar el incremento del ProgressBar según como se actualiza el TextView.