2011-07-13 19 views
5

Estoy teniendo problemas para entender cómo usar la lógica Looperprepare()/loop()/quit().Detalles sobre el uso de Looper.prepare() en Android

Tengo tres hilos: uno es el hilo de UI, uno es un hilo lógico del juego y el último es un hilo de comunicación de red (un hilo de fondo, solo vive mientras se usa).

El hilo del juego tiene muchas dependencias en los resultados de las llamadas de red, así que quise girar el hilo de la red fuera del hilo del juego y tener un Handler publicar el resultado.

Por supuesto, dado que el hilo de UI no está involucrado, necesito llamar al Looper.prepare() ... en algún lado. Pensé que debería llamarse en el hilo del juego, pero no puedo hacerlo porque loop() se hace cargo.

¿Cómo hago para volver a publicar en el hilo del juego el hilo de la red con mi controlador?

Respuesta

7

Lo que pasa es que una vez que se llama a Looper.prepare() seguido de Looper.loop() en un hilo, hilo de todo lo que va a hacer cada vez es su servicio MessageQueue hasta que alguien llama quit() en su Looper.

La otra es darse cuenta de que, por defecto, cuando se crea una instancia de un manejador, su código siempre se ejecutará en el hilo que se creó el

Lo que debe hacer es crear un nuevo hilo y en ejecución () llama a Looper.prepare(), configura cualquier controlador y luego llama a Looper.loop().

Teniendo en cuenta estas cosas aquí es el patrón básico que uso en muchos lugares. Además, existe una buena posibilidad de que simplemente deberías utilizar AsyncTask.

public class NetworkThread extends Thread { 
    private Handler mHandler; 
    private Handler mCallback; 
    private int QUIT = 0; 
    private int DOWNLOAD_FILE = 1; 
    public NetworkThread(Handler onDownloaded) { 
     mCallback = onDownloaded; 
    } 

    public void run() { 
     Looper.prepare(); 
     mHandler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 
       switch (msg.what) { 
        // things that this thread should do 
        case QUIT: 
         Looper.myLooper().quit(); 
         break; 
        case DOWNLOAD_FILE: 
         // download the file 
         mCallback.sendMessage(/*result is ready*/); 
       } 
      } 
     } 
     Looper.loop(); 
    } 

    public void stopWorking() { 
     // construct message to send to mHandler that causes it to call 
     // Looper.myLooper().quit 
    } 

    public void downloadFile(String url) { 
     // construct a message to send to mHandler that will cause it to 
     // download the file 
    } 
} 
0

¿Podría decirnos algunos ejemplos de lo que está utilizando su hilo de red? Creo que puedes resolver tus problemas sin usar Looper.

Puede usar ASyncTask para realizar tareas en segundo plano que pueden actualizar algunos valores en su subproceso de interfaz de usuario. Si el usuario tiene que esperar hasta que finalice la operación de fondo, puede mostrar ProgressDialog y bloquear la aplicación en el método OnPreExecute, y luego ocultarlo en onPostExecute.

Como dije, por favor describa más sus necesidades y objetivos que desea lograr.

Cuestiones relacionadas