Cómo hacer una Carga de Datos con Actualización de Interfaz
El objetivo de este tutorial es implementar una Actividad en la cual podamos realizar una carga de datos y mostrar el progreso al usuario mientras espera.
En este ejemplo, no realizaremos una carga de datos real, simplemente crearemos una secuencia que muestre un TextView con un progreso del 0% al 100%. Una vez completada la "carga", se abrirá otra actividad.
Esta técnica se puede utilizar a partir de Android 1.5 (CupCake).
Creación del proyecto y actividades
En primer lugar, crearemos un nuevo proyecto llamado "CargaDatos" con un nombre de paquete válido y especificaremos la versión mínima de Android que soportará nuestra aplicación.
El asistente nos ayudará a crear la primera Actividad llamada "CargaActivity", que tendrá asociado un archivo de diseño llamado "activity_carga.xml". Esta actividad se encargará de mostrar un TextView con el progreso de la carga, utilizando una clase AsyncTask.
En total, implementaremos dos Activities y dos archivos de diseño XML:
- CargaActivity.java
- MainActivity.java
- activity_carga.xml
- activity_main.xml
Para declarar las actividades en el archivo AndroidManifest.xml, se debe agregar el siguiente código:
1<manifest package="com.example.cargadatos" android:versionCode="1" android:versionName="1.0">
2 <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" />
3 <application android:icon="@drawable/logoimaginaformacion" android:label="@string/app_name" android:theme="@style/AppTheme">
4 <activity android:name=".CargaActivity" android:label="@string/title_activity_carga">
5 <intent-filter>
6 <action android:name="android.intent.action.MAIN" />
7 <category android:name="android.intent.category.LAUNCHER" />
8 </intent-filter>
9 </activity>
10 <activity android:name=".MainActivity" android:label="@string/title_activity_main" />
11 </application>
12</manifest>
Actualización de recursos
Abre el archivo string.xml
ubicado en res/values/string.xml
y modifícalo de la siguiente manera:
1<resources>
2 <string name="app_name">CargaDatos</string>
3 <string name="menu_settings">CargaDatos</string>
4 <string name="title_activity_carga">CargaActivity</string>
5 <string name="title_activity_main">MainActivity</string>
6 <string name="saludo">Bienvenido</string>
7</resources>
Ahora vamos a definir los archivos visuales. Podremos ver el logotipo de Imagina Group en el centro de la actividad, seguido de un TextView y una ProgressBar.
Descarga la imagen y renómbrala como logoimaginaformacion.png
, luego guárdala en la carpeta drawable-mdpi
.
activity_carga.xml
1<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:paddingLeft="@dimen/activity_horizontal_margin"
6 android:paddingTop="@dimen/activity_vertical_margin"
7 android:paddingRight="@dimen/activity_horizontal_margin"
8 android:paddingBottom="@dimen/activity_vertical_margin"
9 tools:context=".CargaActivity">
10
11 <ImageView
12 android:layout_width="wrap_content"
13 android
14
15:layout_height="wrap_content"
16 android:layout_centerInParent="true"
17 android:src="@drawable/logoimaginaformacion" />
18
19 <TextView
20 android:id="@+id/loadText"
21 android:layout_width="wrap_content"
22 android:layout_height="wrap_content"
23 android:layout_below="@id/logo"
24 android:layout_centerHorizontal="true"
25 android:textSize="20sp"
26 android:textColor="@android:color/black" />
27
28 <ProgressBar
29 android:id="@+id/progressBar1"
30 style="?android:attr/progressBarStyleHorizontal"
31 android:layout_width="match_parent"
32 android:layout_height="wrap_content"
33 android:layout_below="@id/loadText"
34 android:layout_marginTop="16dp"
35 android:max="100"
36 android:progress="0" />
37
38</RelativeLayout>
Implementación de las actividades
La actividad CargaActivity
es más compleja debido al uso de AsyncTask.
CargaActivity.java
1package com.example.cargadatos;
2
3import android.app.Activity;
4import android.content.Context;
5import android.content.Intent;
6import android.graphics.Color;
7import android.os.AsyncTask;
8import android.os.Bundle;
9import android.widget.ProgressBar;
10import android.widget.TextView;
11
12public class CargaActivity extends Activity {
13 TextView loadText;
14 ProgressBar progressBar;
15
16 @Override
17 public void onCreate(Bundle savedInstanceState) {
18 super.onCreate(savedInstanceState);
19 setContentView(R.layout.activity_carga);
20
21 loadText = (TextView) findViewById(R.id.loadText);
22 progressBar = (ProgressBar) findViewById(R.id.progressBar1);
23
24 progressBar.setMax(100);
25 progressBar.setBackgroundColor(Color.GRAY);
26 progressBar.setProgress(0);
27
28 AsyncTaskCargaDatos ATCargaDatos = new AsyncTaskCargaDatos(this);
29 ATCargaDatos.execute();
30 }
31
32 // AsyncTask para la carga de datos
33 public class AsyncTaskCargaDatos extends AsyncTask<Void, Integer, Void> {
34 Context mContext;
35
36 AsyncTaskCargaDatos(Context context) {
37 mContext = context;
38 }
39
40 @Override
41 protected Void doInBackground(Void... params) {
42 publishProgress(0);
43
44 for (int i = 0; i < 100; i++) {
45 try {
46 Thread.sleep(50);
47 publishProgress(i + 1);
48 } catch (InterruptedException e) {
49 e.printStackTrace();
50 }
51 }
52
53 return null;
54 }
55
56 @Override
57 protected void onProgressUpdate(Integer... value) {
58 loadText.setText(value[0] + " %");
59 progressBar.setProgress(value[0]);
60 }
61
62 @Override
63 protected void onPostExecute(Void result) {
64 mContext.startActivity(new Intent(mContext, MainActivity.class));
65 finish();
66 }
67 }
68}
La clase AsyncTask
permite ejecutar procesos en segundo plano mientras la actividad sigue funcionando normalmente. AsyncTask
está diseñada para actualizar las interfaces de las Activities y se compone de una serie de hilos que tienen acceso a los métodos y objetos de la Activity que lo invoca.
Al implementar esta clase, se pueden sobrescribir cuatro métodos que se comunican entre sí:
onPreExecute()
: Este método se ejecuta antes de doInBackground()
. El valor devuelto será recibido por doInBackground()
.doInBackground()
: Aquí se realiza el trabajo "pesado" de la carga. Se puede analizar un archivo XML, cargar gráficos en la memoria para un juego, descargar la información necesaria del servidor, etc. El valor devuelto será recibido por onPostExecute()
.onProgressUpdate()
: Este método se encarga de actualizar la interfaz de la actividad mientras `do
InBackground()sigue cargando. Se ejecuta cada vez que
doInBackground()llama al método
publishProgress(param)`.
onPostExecute()
: Se ejecuta al finalizar la tarea en segundo plano. Aquí se puede realizar alguna acción adicional o abrir otra actividad, como en este ejemplo.
Una vez que todo esté preparado, puedes ejecutar la aplicación y observar cómo el ProgressBar se incrementa mientras se actualiza el TextView con el progreso de la carga.
Aprende a programar en Android
En este tutorial, aprendimos cómo configurar una carga de datos con actualización de interfaz en Android utilizando la clase AsyncTask. Esto nos permite realizar tareas en segundo plano de manera eficiente y mantener a los usuarios informados sobre el progreso de la carga.
Si estás interesado en aprender más sobre programación en Android y desarrollar habilidades sólidas en el desarrollo de aplicaciones móviles, te recomiendo nuestro curso de programación en Android. Aprenderás los conceptos fundamentales y las mejores prácticas para crear aplicaciones Android de alta calidad.
¡No dudes en explorar y aprovechar al máximo el curso para llevar tus habilidades de desarrollo de Android al siguiente nivel!