Cómo implementar un Runnable con un no-bloqueador Looper / Handler

Cuando implementa un Runnable que utiliza un Handler y Looper, termina con una cola de bloqueo para los mensajes / Runnables dentro del método run () de su Runnable, porque bloquea el método loop ().

Me gusta esto:

public class Task1 implements Runnable { private Handler mHandler; private boolean mCancelled = false; private void init() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg) { // process incoming messages here } }; Looper.loop(); } @Override public void run() { init(); while (!mCancelled) { try { // do stuff here TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { // handle exception here e.printStackTrace(); } } } public void cancel() { mCancelled = true; Looper.quit(); } } 

En la implementación de Looper.class verá que la cola que se está utilizando hace una llamada a queue.next () que puede bloquear el subproceso en ejecución.

 public static void loop() { // ... for (;;) { Message msg = queue.next(); // might block // ... } } 

Esto NO es lo que quiero. Quiero ser capaz de utilizar la tarea runnable para comunicarse con un manejador (enviar y recibir mensajes), pero también hacer el trabajo real dentro del método run (), por ejemplo comunicaciones Bluetooth. Cuando llama al método connect () de un BluetoothSocket, esta llamada bloquea el subproceso actual hasta que se realiza una conexión. (Vea BluetoothSocket.connect () para más detalles.Así que esto significa que tengo un hilo de bloqueo, siempre y cuando no se hace ninguna conexión.No hay nada para comunicarse sin una conexión establecida, por lo que es bueno.Después de la conexión se establece, me gustaría para intercambiar mensajes.Si el hilo / runnable se cancela, también salir del Looper / Handler.

Ahora mi pregunta es: ¿cómo puedo usar un Looper / Handler dentro de un Runnable y no dejar que el Looper bloquee el Runnable para que el código normal se pueda ejecutar en su lugar? Sólo quiero recibir mensajes a través del manejador, no Runnables!

Gracias por su amable ayuda.

Edit: demasiado malo el Looper no tiene una función como la interfaz de BlockingQueue hace, como take () en lugar de next (), que está bloqueando.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.