2012-07-18 198 views
0

我不明白:代碼執行行的順序

在ShakeListener類中,我在包含類中執行例程。

的例程是:

public void showWord(){ 
     myShakeListener.stop();  

     flipper.showNext(); 

     v.vibrate(countdown5, -1); 

     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     myShakeListener.start(); 
    } 

奇怪的事情(對我來說,仍然是一個初學者),是線程睡眠之前顯示的下一個視圖。這是爲什麼?

我要完成什麼:用戶搖動手機 - > viewflipper翻轉到下一個 - >手機不響應搖晃5秒 - >用戶搖動手機 - > viewflipper翻轉到下一個... ...

日Thnx

回答

1

問題是viewflipper可能是另一個線程。你遇到了一個競爭條件。更好的選擇是產生一個線程5秒,當它啓動時設置一個叫做「noshake」的布爾值爲true,並在完成時將其設置爲false。在允許再次搖動之前檢查noshake == false。

這有道理嗎?

+0

是的!我明白了..將盡快實施並在此之後正確標記此答案。日Thnx – 2012-07-19 10:20:36

1

這是因爲你的代碼阻塞了UI線程。你應該這樣做:

Handler mHandler = new Handler(); 
public void showWord(){ 
    myShakeListener.stop();  

    flipper.showNext(); 

    v.vibrate(countdown5, -1); 

    mHandler.postAtTime(new Runnable() { 
     @Override 
     public void run() { 
      myShakeListener.start(); 
     } 
    }, 5000); 
}