2014-10-04 82 views
2

你好,這不是我的主要代碼,但它足夠接近顯示我的問題。Android Java處理程序,線程同步塊(notifyall&Wait)

我需要創建UI延遲(兩次) - 一個在另一個之後 我無法單獨使用handler.postDelay。

所以我已經嘗試使它與線程。

我想要做的是讓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

不要使用線程和像這樣的同步。你似乎也阻止了主要的UI線程。 'postDelayed()'應該適用於像這樣的用例,而不涉及線程。 – laalto 2014-10-04 13:10:21

+0

我不能只使用postDelay,因爲我真的需要一個標誌檢查第一個延遲結束。請不要告訴我將第二個帖子的延遲設置得更大會引起更多問題。那麼我怎麼能用一面旗子呢? – 2014-10-04 13:26:53

+0

如果可運行引擎相互依賴,則在處理第一個即可運行的本文後,發佈另一個運行引擎。 – laalto 2014-10-04 13:29:52

回答

1

保持簡單:

  • 一個處理程序,沒有線程
  • 後延遲可運行在做兩件事情:
    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」併發布,如果它幫助。同時感謝 – 2014-10-04 17:05:01

+0

很好的答案。你不完全希望postDelayed的參數是以另一種順序嗎? – 2014-10-04 17:13:09

+0

如果你願意,你可以切換顏色;) – ben75 2014-10-04 17:21:05

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() – 2014-10-04 18:50:05