Android Threading: ejecutar un hilo desde otro hilo y esperar un mensaje del controlador

Mi aplicación usa un Ejecutor para crear subprocesos para realizar tareas.

Tengo un subproceso que carga y devuelve mapas de bits al subproceso principal cuando es necesario.

Si el mapa de bits no se encuentra localmente, se utiliza otro subproceso para realizar la descarga del archivo.

Todos los subprocesos crean un Looper para garantizar que se puedan crear controladores a partir de ese subproceso (en caso de que necesite comunicarse con otro subproceso mediante el envío de mensajes al controlador).

public class LooperThread extends Thread
{ 
    @Override
    public void run()
    {
        Looper.prepare();
        super.run();
        Looper.loop();
    }
}

El hilo principal le pide a Thread-1 que obtenga el mapa de bits. Si el mapa de bits existe, se devuelve correctamente al subproceso principal. Si el mapa de bits no existe, Thread-1 le pide a Thread-2 que lo descargue. Se crea un controlador en Thread-1 para que Thread-2 pueda usarlo para decirle a Thread-1 cuándo se completa la descarga.

El problema es que Thread-1 completa su ejecución y sale antes de que se complete la descarga, por lo que cuando Thread-2 envía un mensaje a través del controlador, no hay nada para procesar el mensaje.

final RequestHandler handler = new RequestHandler()
{
    @Override
    protected void onComplete(Object response)
    {
       //This never happens as Thead-1 is already finished when download is complete
        DownloadCompleteData data = (DownloadCompleteData)response;

        onDownloadComplete(data.success, data.downloadId, data.filePath);
    }
};

myExecutor.execute(new Runnable()
{
    public void run()
    {
        //blocking download call
        DownloadCompleteData data = download(downloadRequest);

        //Thread-2 now sends message back to Thread-1 
        handler.sendMessage(handler.obtainMessage(COMPLETE, data));
    }
});

Creo que necesito ejecutar un ciclo infinito en Thread-1 para que pueda mantenerse vivo y seguir procesando mensajes hasta que se interrumpa, pero no estoy seguro de cómo hacerlo correctamente.

Alguien sabe la forma correcta de hacerlo?

preguntado el 03 de mayo de 12 a las 18:05

¿Cómo se detiene Thread-1? Los loopers no se detienen a menos que les digas que lo hagan. -

Supuse que una vez que el subproceso había salido de su método run(), el subproceso ya no procesaría mensajes en su bucle de mensajes. No detengo explícitamente el subproceso o el looper: los ejecutores administran los subprocesos. Si el bucle de mensajes aún se está ejecutando, entonces la verdadera pregunta es ¿por qué Thread-2 no recibe el mensaje enviado desde Thread-1? -

Looper.loop() es un bucle infinito. Los mensajes de la cola de mensajes interna se procesan en ese ciclo. Por lo tanto, no puede esperar a que se entreguen los mensajes (porque se espera a sí mismo). No estoy seguro si eso es lo que haces. También echa un vistazo a Controlador de hilo - ya implementan la lógica del looper para que no tengas que hacerlo tú. -

Mmm ok gracias. Esto todavía no explica por qué RequestHandler.handleMessage(Message m) no recibe el mensaje que se envía desde Thread-2. [RequestHandler.handleMessage llama al método onComplete (Respuesta de objeto) que puede ver definido en el segundo bloque de código anterior] ¿Alguna idea? -

Debe averiguar por qué Thread-1 está saliendo. ¿Puedes publicar el código que muestra cómo el hilo principal le pide a Thread-1 que obtenga el mapa de bits? -

1 Respuestas

No estoy seguro si quieres hacerlo de esta manera, pero puedes probar un código similar a este en el hilo-1

if(bitmapIsntFound)
{
    Thread-2.start();
    try
    { 
        Thread-1.wait();
    }

    catch(InterruptedException e) 
    {
    System.out.println("Thread-1
    }

}

Esto iniciará su segundo subproceso para descargar el mapa de bits, luego le indicará al primer subproceso que espere mientras el segundo continúa ejecutándose. Después de que el segundo termine de descargarse, querrá llamar a Thread-1.notify() para reiniciar Thread-1.

Debido a que pausó Thread-1 a mitad de la transmisión, no habrá pasado de la instrucción try{ } catch(){ }, por lo que la descarga está garantizada cuando se reanude Thread-1, y puede simplemente llamarla al hilo.

Respondido el 31 de diciembre de 12 a las 23:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.