2010-07-19 3 views
5

Ist es möglich, dass ein Hintergrund-Thread eine Nachricht an den Handler und den Block des Haupt-UI-Threads in die Warteschlange einfügt, bis diese Nachricht bearbeitet wurde?Android: Kann Hintergrundthread blockiert werden, bis der UI-Thread den Vorgang beendet?

Der Kontext dafür ist, dass ich mein Remote-Service wie jeden veröffentlichten Betrieb aus seinem Haupt-UI-Thread zu bedienen, statt des Threadpool-Thread von dem ihm die IPC-Anforderung empfangen.

Antwort

4

Dies sollte tun, was Sie brauchen. Es verwendet notify() und wait() mit einer bekannten Aufgabe, diese Methode in ihrer Art synchron zu machen. Alles innerhalb von run() wird auf dem UI-Thread ausgeführt und gibt nach Abschluss die Kontrolle an doSomething() zurück. Dies wird natürlich den aufrufenden Thread in den Ruhezustand versetzen.

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

Ich verstehe nicht, was Aufruf von notify() auf einem String tun würde? –

Verwandte Themen