Tutorial y ejemplos de Android Runnable

En esta clase vemos la interfaz Runnable y vemos sus ejemplos de uso.

¿Qué es un Runnable?

En java la interfaz Runnable es básicamente una abstracción para un comando ejecutable.

Hemos hablado de la clase Thread como una construcción de concurrencia de bajo nivel para java y android.

Bueno, otro bloque de construcción es el Runnable, una interfaz que proviene de la API de Java, y que pretende especificar y encapsular el código que está destinado a ser ejecutado por una instancia de Java thread o cualquier otra clase que maneje este Runnable.

Es una interfaz y está definida en el paquete java.lang y tiene un método abstracto llamado run() que debemos implementar.

package java.lang;
public interface Runnable{
    public abstract void run();
}

Uso

La interfaz Runnable se utiliza mucho para ejecutar código en Threads.
La interfaz Runnable tiene un método abstracto llamado run():

public abstract void run ()

Normalmente implementas ese método siempre que tu clase implemente la interfaz Runnable.
El método será llamado para comenzar a ejecutar la parte activa del código de la clase.

Digamos que queremos usar Runnable como nuestro mecanismo de enhebrado. Pues bien, primero implementa la interfaz. Luego, proporciona la implementación del método run():

public class MyRunnable implements Runnable {
    public void run(){
        Log.d("Generic","Running in the Thread " +
        Thread.currentThread().getId());
    }
}

Con esto, nuestra subclase Runnable puede ahora ser pasada a Thread y se ejecuta independientemente en la línea de ejecución concurrente:

    Thread thread = new Thread(new MyRunnable());
    thread.start();

En el siguiente código, básicamente hemos creado la subclase Runnable para que
implemente el método run() y pueda ser pasada y ejecutada por un hilo:

Interfaz Runnable Subclases indirectas

Runnable` tiene muchas subclases, por lo que sólo enumeramos algunas de las más utilizadas:

| No. | Clase Descripción

| La clase Thread hace uso del método abstracto run() de Runnable llamando al método concreto run() de Thread. Este método run() llama al método abstracto run() del Runnable internamente. |
| 2. TimerTask Una clase abstracta utilizada para describir una tarea que debe ejecutarse en un momento determinado, tal vez una vez, tal vez de forma recurrente. |
| 3. | Esta clase implementa la interfaz RunnableFuture, que implementa la interfaz Runnable. |

Veamos ahora algunos ejemplos:

Ejemplo de Android Runnable paso a paso

Este es un ejemplo de Android. Android obviamente utiliza Java y la interfaz Runnable ha existido desde el nivel 1 de la API.

Podemos utilizar un Runnable con un Service de la siguiente manera:

public class MyService extends Service implements Runnable{}

Esto nos obligará a implementar el método abstracto run() dentro de esa clase:

 @Override
    public void run() {
    }

Y dado que se trata de un Service también tendremos que sobreescribir otro método abstracto para Service llamado onBind()

 @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

El Service es un componente de Android que tiene callbacks del ciclo de vida. Uno de ellos es onCreate(), un método que se activa cada vez que se crea un Service.

Así que para nosotros cada vez que esto ocurra queremos crear un thread e iniciarlo:

@Override
    public void onCreate() {
        super.onCreate();
        Thread myThead=new Thread(this);
        myThead.start();
    }

Entonces digamos que queremos registrar algunos mensajes cada 1 segundo, añadimos el siguiente código dentro del método run():

        while (true)
        {
            try{

                Log.i(MY_TAG,"Distance in Light Years : "+spaceship_distance);
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

Luego como variables de instancia, añade lo siguiente encima de tu método onCreate():

public static String MY_TAG="MY_SERVICE";
private int spaceship_distance=0;

Bueno, este es un ejemplo del uso de Runnable con Android. Si estás interesado en que el Service se ejecute realmente: entonces haz lo siguiente:

  1. Registra el Service en el Manifiesto:

```java

```

Asegúrate de especificar el nombre de tu <code>Servicio</code> en lugar de <code>MiServicio</code>.</code></pre>
<ol start="2">
<li>Inicia el <code>Service</code> en la <code>MainActivity</code>:</li>
</ol>
<!-- 12 -->
<pre><code>&#x60;&#x60;&#x60;java
Intent i=new Intent(this,MyService.class);
startService(i);
```

Y eso es todo, un ejemplo de interfaz androide Runnable con servicios.

Ten en cuenta que a veces la gente utiliza Runnable de esta manera:

    @Override
    public void onCreate() {
        super.onCreate();

        new Thread(new Runnable() {
            @Override
            public void run() {
                ArrayList<Song> songs = scanSongs(ScanMusicService.this);
                LogUtils.d(songs);
                ToastUtils.showLongToast(songs.toString());
            }
        }).start();

    }

Ejemplos rápidos de Runnable

(a). Cómo realizar un HTTP GET con HttpURLConnection y Runnable.

HttpURLConnection es nuestra clase de red y nos permite realizar nuestra petición HTTP GET.

Por otro lado Runnable es nuestra interfaz que nos permitirá realizar nuestra petición HTTP GET en el hilo de fondo.

Así que empieza implementando la interfaz Runnable, lo que te obliga a anular el método run().

Es dentro de ese método run() donde realizamos nuestro HTTP GET :

public class UrlRequest implements Runnable {
    ......
 @Override
    public void run() {
        try {
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            InputStream stream = connection.getInputStream();
            int responseCode = connection.getResponseCode();
            ByteArrayOutputStream responseBody = new ByteArrayOutputStream();
            byte buffer[] = new byte[1024];
            int bytesRead = 0;
            while ((bytesRead = stream.read(buffer)) > 0) {
                responseBody.write(buffer, 0, bytesRead);
            }
            listener.onReceivedBody(responseCode, responseBody.toByteArray());
        }
        catch (Exception e) {
            listener.onError(e);
        }
    }
}

Aquí está la clase completa:

import android.support.annotation.NonNull;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class UrlRequest implements Runnable {

    public interface Listener {

        void onReceivedBody(int responseCode, byte body[]);
        void onError(Exception e);
    }

    public interface RequestFactory {

        @NonNull
        UrlRequest makeRequest(URL url, Listener listener);
    }
    private static RequestFactory factory = new RequestFactory() {
        @NonNull
        @Override
        public UrlRequest makeRequest(URL url, Listener listener) {
            return new UrlRequest(url, listener);
        }
    };

    private URL url;
    private Listener listener;

    public static UrlRequest makeRequest(URL url, Listener listener) {
        return factory.makeRequest(url, listener);
    }

    public static void setFactory(RequestFactory newFactory) {
        factory = newFactory;
    }

    public UrlRequest(URL url, Listener listener) {
        this.url = url;
        this.listener = listener;
    }

    @Override
    public void run() {
        try {
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            InputStream stream = connection.getInputStream();
            int responseCode = connection.getResponseCode();
            ByteArrayOutputStream responseBody = new ByteArrayOutputStream();
            byte buffer[] = new byte[1024];
            int bytesRead = 0;
            while ((bytesRead = stream.read(buffer)) > 0) {
                responseBody.write(buffer, 0, bytesRead);
            }
            listener.onReceivedBody(responseCode, responseBody.toByteArray());
        }
        catch (Exception e) {
            listener.onError(e);
        }
    }
}

Categorizado en:

Etiquetado en: