Imagina

Configura una carga de datos actualizando la interfaz en Android

Android
Intermedio
15'

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.

¿Quieres un plan de formación personalizado?

*requerido

  • Responsable de los datos: IMAGINA WEB & MOBILE TECHNOLOGIES S.L.
  • Finalidad de los datos: Responder a la información solicitada, envío de boletines de noticias y ofertas.
  • Destinatarios: IMAGINA WEB & MOBILE TECHNOLOGIES S.L. No se cederán los datos a terceros.
  • Derechos: En cualquier momento puedes acceder, recuperar y borrar tu información.

¿Quieres un curso personalizado?

*requerido

  • Responsable de los datos: IMAGINA WEB & MOBILE TECHNOLOGIES S.L.
  • Finalidad de los datos: Responder a la información solicitada, envío de boletines de noticias y ofertas.
  • Destinatarios: IMAGINA WEB & MOBILE TECHNOLOGIES S.L. No se cederán los datos a terceros.
  • Derechos: En cualquier momento puedes acceder, recuperar y borrar tu información.