2014-10-04 3 views
2

Здравствуйте, это не мой основной код, но его достаточно близко, чтобы показать мою проблему.Android-обработчик Java, синхронизированный поток (notifyall & Wait)

Мне нужно создать задержку пользовательского интерфейса (дважды) - один за другим Я не мог сделать это с handler.postDelay в одиночку.

поэтому я попытался сделать его с Threading.

Что я хочу сделать, это запустить t2 только после окончания t1.

Может ли кто-нибудь помочь мне?

final Handler handler1 = new Handler(); 
    final Handler handler2 = new Handler(); 


    synchronized(this) 
    { 


    Thread t1= new Thread(new Runnable() { 

     public void run() 
     { 

      handler1.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        // Do something after 3s = 3000ms 
        imgB1.setBackgroundColor(Color.RED); 
       notifyAll(); 
       } 
      }, 3000); 

     } 
    }); 



    Thread t2= new Thread(new Runnable() { 

     public void run() 
     { 

       handler2.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         // Do something after 3s = 3000ms 
         imgB1.setBackgroundColor(Color.YELLOW); 
         } 
       }, 3000); 

     } 
     }); 



    t1.start(); 



    while (t1.isAlive() ) 
    { 
     try { 
      wait(); 

     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 


    t2.start(); 

    } 
+0

Не используйте темы и синхронизация, подобная этой. Вы, похоже, также блокируете основной поток пользовательского интерфейса. 'postDelayed()' должен отлично работать для подобных случаев, без привлечения потоков. – laalto

+0

Я не могу использовать только postDelay, потому что мне действительно нужна проверка флага для завершения первой задержки. Пожалуйста, не говорите мне, чтобы установить вторую задержку сообщения больше, это вызовет больше проблем. Так как я могу сделать это с флагом? –

+0

Если runnables зависят друг от друга, отправьте другой после обработки первой i.e. сообщения из самой runnable. – laalto

ответ

1

Держите это просто:

  • один обработчик, без резьбы
  • разместить отсроченную Runnable делать 2 вещи:
    1. установить красный фон
    2. проводку другой задержку работоспособной (настройку желтый фон)

final Handler handler1 = new Handler(Looper.getMainLooper()); 
handler1.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       // Do something after 3s = 3000ms 
       imgB1.setBackgroundColor(Color.RED); 
       //post another action to be executed in 3 sec 
       handler1.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         // Do something after 3s = 3000ms 
         imgB1.setBackgroundColor(Color.YELLOW); 
        } 
       }, 3000); 
      } 
     }, 3000); 
+0

Я попробую работать с «Вложенным PostDelay» и отправить, если это поможет. спасибо тем временем –

+0

Отличный ответ. Разве вы не согласны с тем, что аргументы для postDelayed были в другом порядке? –

+0

вы можете переключать цвета, если хотите;) – ben75

1

Вы также можете держать его просто таким образом:

  • одну нить, нет обработчика

Thread t = new Thread(new Runnable() { 
        @Override 
        public void run() { 
         SystemClock.sleep(3000); 
         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           imgB1.setBackgroundColor(Color.RED);  
          } 
         }); 
         SystemClock.sleep(3000); 
         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           imgB1.setBackgroundColor(Color.YELLOW); 
          } 
         }); 
        } 
       }); 
       t.start(); 
+0

Я пробовал работать с методом вместо imgB1.setBackgroundColor и я получаю ошибку AndroidRuntime (10657): java.lang.RuntimeException: не удается создать обработчик внутри потока, который не вызвал Looper.prepare() –

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