Actualización UI desde procesos en segundo plano

martes, 5 de febrero de 2013 Etiquetas: , ,


Introducción

En ocasiones nuestra aplicación necesita realizar tareas en segundo plano, debido al tiempo que tardan en realizarse, por ejemplo la descarga de información de internet o la conexión por Bluetooth. También puede darse el caso que nuestra aplicación tenga una service que se este ejecutando, por ejemplo para leer periodicamente datos de una web.

En estos procesos de segundo plano, puede que necesitemos visualizar algún tipo de información al usuario, por ejemplo mediante un Toast. Si lo ejecutamos directamente en el Thread o en el Service, nos dará error, ya que no esta permitida esta actualización de la interfaz de usuario desde estos procesos. Veamos como lo podemos hacer.


Solución

Una solución sencilla es utilizar la clase que nos proporciona Android para realizar procesos en segundo plano: AsyncTask . Desde esta clase si que esta permitido actualizar la interfaz gráfica sin ningún problema, así que es una buena opción usarla, su utilización la veremos en un post próximamente.

En los casos que no puedas utilizar la clase AsyncTask y es necesario utilizar la clase Thread, podemos utilizar una clase intermedia Handler para poder actualizar la UI. Vamos a ver como usarla que es muy sencillo:

public class MyActivity extends Activity {
  . . .
  // --> 1
  private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      super.handleMessage(msg);    
      Toast.makeText(MyActivity.this,"Mensaje desde el Thread").show();
    } 
  };
  
  
  class MyThread extends Thread {
    private Handler handler;
  
    // --> 2  
    public MyThread (Hander h){
      handler = h;
    }
    
    // --> 3
    @Override
    public void run() {
      //Do some heavy processing
      Message msg = Message.obtain();
      msg.what = 555;
      handler.sendMessage(msg);
     }
  }
  . . .
}

Veamos los puntos señalados del código:
  1. Primero creamos una clase de tipo Handler, con un único método que se encarga de capturar el mensaje que se envíara desde el Thread y realizar las operaciones necesarias sobre la interfaz de usuario.
  2. Creamos nuestra clase que ejecutará el proceso pesado en segundo plano. En el contructor le pasamos el handler que se encargará de modifiar la UI
  3. Sobreescribimos el método run, donde se ejecuta el proceso y una vez finalizado vemos como se realiza la llamada al handler para que actualice la UI

Bibliografia

[] Handler : Android Developers (inglés)

0 comentarios:

Publicar un comentario