Configura una carga de datos actualizando la interfaz en Android

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).

Creación proyecto

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 layout activity_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.

figura11 Configura una carga de datos actualizando la interfaz en Android

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
figura21 Configura una carga de datos actualizando la interfaz en Android

Implementación del proyecto

En primer lugar declararemos las actividades en el AndroidManifest.xml



    

    
        
            
                
                
            
        
        
                
    


Abriremos el fichero string.xml localizado dentro de res/values/string.xml y lo modificaremos.


    CargaDatos
    CargaDatos
    CargaActivity
    MainActivity    
    MainActivity

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.

figura3 Configura una carga de datos actualizando la interfaz en Android

Descargaros la imagen y renombrarla como logoimaginaformacion.png. Descargarla desde:

http://www.imaginagroup.com/wp-content/themes/starkers/images/logo-imagina-formacion.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 {

		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 ésta 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 memória los gráficos de un juego, descargar de servidor la información necesaría, etc... El valor devuelto lo recibirá onPostExecute.

onProgressUpdate --> Proceso encargado de actualizar la interfaz de la actividad mientras doInBackGround sigue cargando. Él método se ejecutará cada vez que doInBackGround ejecute el método publishProgress(param);.

Una vez todo preparado lo podemos ejecutar y visualizar el incremento del ProgressBar según como se actualiza el TextView.

figura4 Configura una carga de datos actualizando la interfaz en Android

AsyncTask es una herramienta muy útil en multitud de situaciones que necesitan realizar una tarea rápida en background.

figura71 Configura una carga de datos actualizando la interfaz en Android

¿Conoces nuestro curso Online de Android?