2016-12-23 10 views
-3

基本的に、私は各ユーザーに対して5 Runnablesを持っています。Android:Runnable内のRunnable

各実行可能ファイルの内部では、変数が変更されるまで待つ必要があります。私はセマフォまたはCountDownLatchを使用しています。

各ランナブルの内部には、待機するための実行可能ファイルがあります。

例を示します。 r1はユーザであると考えられる実行可能ファイルなので、決して終了しません。

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); 
    } 
} 

latch.await()を使用しているときの問題は、UIをブロックするようにメインスレッドで実行されていることです。

さまざまなスレッドでこれらの実行可能ファイルをどのように起動するのか考えてみましょうか?

+0

なぜあなたはそれらを入れ子ですか? – Chisko

+0

実際に達成したいことは何ですか? – pskink

+0

[ネストされたpostDelayed/Runnable/Handler Android]の可能な複製(http://stackoverflow.com/questions/11197543/nested-postdelayed-runnable-handler-android) – Chisko

答えて

0

私がやりたかったのは、変数を変更するのをどこかで待つ必要があり、他の命令を続けるスレッドです。ボタンがクリックされたときのUIのどこかで、セマフォが増分されます。スレッドでは、スレッドが使用可能になるまで待機します。ここに私が作った解決策があります

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) { 

       } 
      } 
     }