Llamar a Looper más de una vez provoca "el envío de un mensaje a un controlador en un hilo muerto"

Estoy usando un Ejecutor [grupo de subprocesos fijo] con mi propio ThreadFactory que agrega un Looper:

Handler HANDLER = new Handler();
Executor    THREADS = Executors.newFixedThreadPool(THREAD_POOL_SIZE, new ThreadFactory() {
    @Override public Thread newThread(Runnable runnable) {
        return new MyThread(new Runnable() {
            @Override public void run() {
                Looper.prepare();
                runnable.run();
            }
        });
    }
});

private static class MyHandler extends Handler {
    public boolean fail;
        public void handleMessage(Message msg) {
        switch(msg.what) {
            case 1:
                this.fail = msg.arg1 == 1;
                Looper.myLooper().quit();
                break;
            }
        }
    }
}

Estoy ejecutando un hilo que realiza solicitudes de red, pero si la red falla, me gustaría que se muestre un mensaje de diálogo al usuario. Este proceso es bastante complicado, ya que requiere hacer Y mostrar la solicitud en el hilo de la interfaz de usuario. Puedo esperar la respuesta del usuario al diálogo simplemente agregando un bucle al hilo de la red y esperar a que se envíe un mensaje desde el hilo de la interfaz de usuario. Esto me permite encapsular las solicitudes de red en un hilo de tiempo (tryAgain). Todo funciona bien, excepto cuando el método Looper.loop () se llama por segunda vez (después de que se muestra un segundo cuadro de diálogo de error de red) y el cuadro de diálogo (en el hilo de la interfaz de usuario) envía un mensaje al manejador del hilo de red:

THREADS.execute(new Runnable() {
    private MyHandler   myHandler   = new MyHandler();
    @Override public void run() {
        boolean tryAgain    = true;
        while(tryAgain) {
            try {
                switch(request) {
                    [Handle network requests]
                }
                tryAgain    = false;

            } catch(IOException e) {
                // The network is unavailable.  Ask the user if we should try again.
                e.printStackTrace();

            } finally {
                if(tryAgain) {
                    HANDLER.post(new Runnable() {   // The UI thread
                        @Override public void run() {
                            theAlertDialog.show();
                        }
                    });

                    // Wait for the results from the dialog which lives in the UI thread.
                    Looper.loop();

                    // At this point the dialog has informed us of our answer.
                    tryAgain = !myHandler.fail;
                }
            }
        }
    }
});

En la instancia de AlertDialog hay un OnClickListener:

DialogInterface.OnClickListener myOnclickListener = new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int id) {
        Message msg = myHandler.obtainMessage(1);
        msg.setTarget(this.handler);
        msg.sendToTarget();
    }
}

He comprobado que el hilo todavía está activo conhandler.getLooper().getThread().isAlive() que siempre devuelve verdadero pero todavía me da "enviar un mensaje a un controlador en un hilo muerto". ¿Cómo es que el mensaje / controlador ha decidido que el hilo está muerto? ¿No debería depender del método .isAlive ()? Al final, estoy tratando de evitar replicar la compilación de gestión de subprocesos en el sistema operativo Android :-)

Respuestas a la pregunta(2)

Su respuesta a la pregunta