2016-12-23 3 views
-3

Grundsätzlich habe ich 5 Runnables für jeden Benutzer.Android: Runnable innerhalb Runnable

In jedem Runnable muss gewartet werden, bis sich eine Variable ändert, bis sie fortgesetzt wird. Ich werde entweder einen Semaphor oder einen CountDownLatch verwenden.

Also in jedem Runnable gibt es eine Runnable zum Warten.

Hier ist ein Beispiel. r1 ist ein runnable, der Benutzer sein soll, also niemals endend.

final Handler handler = new Handler(); 
Runnable r1 = new Runnable() { 
    @Override public void run() { 

      // here must be another runnable for waiting 
       Runnable r2 = new Runnable() { 
        @Override public void run() { 

         if (condition) { 
          latch.countDown(); 
          // ending the runnable 
           handler.removeCallbacks(r2); 
         } else { 
          // keep waiting 
          handler.postDelayed(r2, 1000); 
         } 
        } 
       } 

      latch.await(); 
     // restarting the runnable 
     handler.postDelayed(r1, 1000); 
    } 
} 

Das Problem bei latch.await() ist, dass im Haupt-Thread ausgeführt wird, so dass die UI zu blockieren.

Gibt es eine Idee, wie man diese in verschiedenen Threads ausführbar startet?

+0

Warum in der Welt nisten Sie sie ??? – Chisko

+0

was willst du eigentlich erreichen? – pskink

+0

Mögliches Duplikat von [verschachteltes postDelayed/Runnable/Handler Android] (http://stackoverflow.com/questions/11197543/nested-postdelayed-runnable-handler-android) – Chisko

Antwort

0

Was ich tun wollte, ist ein Non-Stop-Thread, der irgendwo auf eine Variable warten muss, um zu ändern, damit es andere Anweisungen fortsetzt. Irgendwo in der Benutzeroberfläche, wenn eine Schaltfläche geklickt wird, wird ein Semaphor inkrementiert. Und im Thread wartet es bis es verfügbar ist. Hier ist die Lösung, die ich gemacht habe

Semaphore sem = new Semaphore(0,true); 
//somewhere in UI sem.release(); 

Thread thread = new Thread() 
     { 
      @Override 
      public void run() { 
       try { 
        while(true) { 
         sleep(1000); 

         semaphore.acquire(); 

         // when updating the UI is needed 
         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           // work 
          } 
         }); 


        } 
       } catch (InterruptedException e) { 

       } 
      } 
     }