2010-07-19 28 views
5

¿Es posible que un hilo de fondo coloque un mensaje en el manejador y bloque del hilo de la interfaz de usuario principal hasta que se haya reparado el mensaje?Android: ¿es posible que el hilo de fondo se bloquee hasta que el hilo de UI termine de funcionar?

El contexto para esto es que me gustaría que mi servicio remoto sirva cada operación publicada fuera de su subproceso de interfaz de usuario principal, en lugar de la cadena de subprocesos desde la que recibió la solicitud de IPC.

Respuesta

4

Esto debería hacer lo que necesita. Utiliza notify() y wait() con un objeto conocido para hacer que este método sea sincrónico por naturaleza. Cualquier cosa dentro de run() se ejecutará en el subproceso de interfaz de usuario y devolverá el control al doSomething() una vez finalizado. Esto, por supuesto, pondrá el hilo de llamada en modo de suspensión.

public void doSomething(MyObject thing) { 
    String sync = ""; 
    class DoInBackground implements Runnable { 
     MyObject thing; 
     String sync; 

     public DoInBackground(MyObject thing, String sync) { 
      this.thing = thing; 
      this.sync = sync; 
     } 

     @Override 
     public void run() { 
      synchronized (sync) { 
       methodToDoSomething(thing); //does in background 
       sync.notify(); // alerts previous thread to wake 
      } 
     } 
    } 

    DoInBackground down = new DoInBackground(thing, sync); 
    synchronized (sync) { 
     try { 
      Activity activity = getFromSomewhere(); 
      activity.runOnUiThread(down); 
      sync.wait(); //Blocks until task is completed 
     } catch (InterruptedException e) { 
      Log.e("PlaylistControl", "Error in up vote", e); 
     } 
    } 
} 
+1

No entiendo lo que llamar notify() en un String haría? –

Cuestiones relacionadas