martes, 12 de junio de 2012

Threads en Android 2: Runnable


Trabajando con Threads en Android II: Runnable

 |  | 6 Comentarios
En el artículo anterior de nuestra serie “Trabajando con threads en Android”, vimos que podemos utilizar Handlers pasándoles mensajes que indiquen cuando un subproceso ha terminado y entonces se puedan hacer modificaciones en el UI thread.
Si el manejo de mensajes te resulta tedioso, también tenemos la opción de manejar objetos de tipo Runnable como parámetro al Handler que definamos; para lo cuál utilizamos los métodos post…().
Pasemos entonces a realizar un ejemplo para ver el manejo de objetos Runnable en un thread secundario.
1. Creamos un nuevo proyecto llamado RunnableTest con la versión Android 2.2.
2. En el archivo main.xml del directorio res > layout vamos a agregar un elemento Buttontal y como te muestro a continuación:
El texto que definiré para mi botón es ¿Quieres ver un hilo en acción?; tú puedes definir el mensaje que gustes. La idea del ejemplo es que al pulsar el botón, se muestre una alertaToast que indique que la acción en background se ha iniciado y cuando éste lleve 10 segundos, la aplicación vuelva a lanzar otra alerta Toast dónde indique que se trata de un thread secundario.
3. Pasemos entonces a copiar el código que deberá ir en la actividad principal de tu proyecto:
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;;
 
public class RunnableTestActivity extends Activity {
 
 final Handler handle = new Handler();
 
 protected void miThread(){
  Thread t = new Thread(){
   public void run(){
    try{
     Thread.sleep(10000);
 
    }catch(InterruptedException e){
     e.printStackTrace();
    }
    handle.post(proceso);
   }
  };
  t.start();
 }
 
 final Runnable proceso = new Runnable(){
  public void run(){
   Toast.makeText(RunnableTestActivity.this,
                    "Este es un hilo en background", Toast.LENGTH_SHORT).show();
  }
 };
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        Button btn = (Button) findViewById(R.id.btn_thread);
        btn.setOnClickListener(new OnClickListener(){
         public void onClick(View view){
          Toast.makeText(RunnableTestActivity.this,
                                 "¡Arrancamos!", Toast.LENGTH_SHORT).show();
         }
        });
        miThread();
 
    }
}
En la primera parte de la clase, definimos nuestro manejador (el objeto Handler) de tipofinal. Inmediatamente creamos un método llamado miThread() que define un objetoThread en su interior, implementando el método run() que define que se dormirá el hilo durante 10 segundos. En el cierre del bloque try/catch es cuando le pasamos al Handlerun objeto Runnable que he llamado proceso y que se encuentra definido líneas abajo.
En la definición de proceso se encuentra la alerta Toast que se mostrará cuando hayan pasado los 10 segundos.
Dentro del método onCreate() recuperamos la referencia del Button a través de su atributo id y le asignamos un evento de tipo onClickListener() que mostrará una alertaToast y posteriormente se llamará al método miThread() que es el que hará toda la magia.
4. Corremos el proyecto y básicamente este es el flujo de ejecución que veremos:
Se carga la interfaz de la actividad.
Se lanza la alerta Toast al oprimir el botón.
Aparece la segunda alerta Toast a los 10 segundos.
En un contexto de ejemplo, el uso de mensajes y objetos Runnable nos ayudan a entender el funcionamiento básico de procesos en segundo plano; sin embargo, en la práctica resulta mejor hacer uso de la clase AsyncTask que veremos a detalle en el siguiente post de esta serie.
Para descargarte el código fuente de este tutorial, visita nuestro repositotrio en GitHub en la carpeta RunnableTest.
Referencia | El Androide Libre

No hay comentarios:

Publicar un comentario