2016-12-23 5 views
-3

В принципе, у меня есть 5 Runnables для каждого пользователя.Android: Runnable inside Runnable

Внутри каждого Runnable должно быть ожидание изменения переменной до ее продолжения. Я буду использовать либо Семафор, либо CountDownLatch.

Таким образом, внутри каждого Runnable существует runnable для ожидания.

Вот пример. r1 - это runnable, который должен быть пользователем, поэтому никогда не заканчивается.

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() является то, что работает в основном потоке, чтобы блокировать пользовательский интерфейс.

Любая идея, как запустить те, которые можно запустить в разных потоках?

+0

Почему в мире вы гнездились? – Chisko

+0

что на самом деле вы хотите достичь? – pskink

+0

Возможный дубликат [вложенного postDelayed/Runnable/Handler Android] (http://stackoverflow.com/questions/11197543/nested-postdelayed-runnable-handler-android) – Chisko

ответ

0

То, что я хотел сделать, это не остановить поток, который где-то должен ждать переменную, чтобы она изменилась, и она продолжает другие инструкции. Где-то в пользовательском интерфейсе при нажатии кнопки семафор увеличивается. И в потоке он ждет, пока он не будет доступен. Вот решение, которое я сделал

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

       } 
      } 
     } 
Смежные вопросы