2012-08-07 59 views
2

爲什麼try塊先執行,我想先改變顏色,然後它應該休眠5000ms。我的意思是系統在顏色改變之前睡覺。 私人OnClickListener CheckAnswer =新OnClickListener(){爲什麼Sleep首先執行並且比在Android上面的代碼更執行?

public void onClick(View arg0) { 
     // TODO Auto-generated method stub 

     disableButtons(); 
     Button incoming=(Button) arg0; 
     if(incoming.getText().toString().equals(Q.getAnswer())) 
     { 
      incoming.setBackgroundColor(Color.GREEN); 
      correct++; 
      score+=15; 
     } 
     else 
     { 
      incoming.setBackgroundColor(Color.RED); 
      wrong++; 
      if(C1.getText().toString().equals(Q.getAnswer())) 
       C1.setBackgroundColor(Color.GREEN); 
      else if(C2.getText().toString().equals(Q.getAnswer())) 
       C2.setBackgroundColor(Color.GREEN); 
      else if(C3.getText().toString().equals(Q.getAnswer())) 
       C3.setBackgroundColor(Color.GREEN); 
      modifyScore(); 

     } 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     questionGenerator(); 
    } 
};` 
+0

我不舒服,但也許你必須在改變顏色後重畫你的元素。 – PKeidel 2012-08-07 21:03:17

+4

你爲什麼要睡覺UI線程? – 2012-08-07 21:04:47

回答

9

我猜想是因爲視圖的屬性已更新,但屏幕重繪卡在睡眠後面。不要睡在主線上。

取而代之的是在您的Activity的onCreate中創建一個Handler,並將延遲的Runnable發佈給它。

private Handler mHandler; 
protected void onCreate(Bundle savedInstanceState) { 
    mHandler = new Handler(); 
} 
... 
private OnClickListener CheckAnswer = new OnClickListener() { 
    public void onClick(View view) { 
     // fix up view 
     mHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       questionGenerator(); 
      } 
     }, 10000); 
    } 
} 
+0

thankssss很多人,已解決:) – Art 2012-08-07 21:19:12

+0

不要忘記接受他的答案,如果它解決了你的問題! – yshavit 2012-08-07 22:50:33

2

你的GUI的主線程上工作的(什麼在Swing叫EDT),這是相同的線程也做了更新。因此,序列爲:

  1. 設置新的背景顏色
  2. 睡眠10秒
  3. onClick回報
  4. 主線程有機會更新組件

我想你」我們會發現不僅背景顏色不會改變,而且整個UI在Thread.sleep完成之前似乎都會凍結。

您需要在另一個線程(我不知道Android,但在Swing中可以使用SwingWorker)執行您的主要工作,以便線程可以自由執行任務,包括更新組件。

+0

搖擺? Android不使用Swing。 – Squonk 2012-08-07 21:09:43

+0

是的,android不使用swing – Art 2012-08-07 21:10:45

+0

雖然我想像的原理是相似的(從來沒有使用Swing)。 Android有像yshavit引用的事件派發線程。這也是繪製/ UI更新完成的線程。通常在Android中,這被稱爲「UI線程」或(更恰當地)稱爲「主線程」。 – cyngus 2012-08-07 21:15:32

0

首先,不要在你的UI線程中睡覺,你會得到一個強制關閉。其次,在OnClickListener結束之前,控件的實際(重新)繪製不會發生。

+0

那麼它應該如何完成? – Art 2012-08-07 21:11:17

+1

@Art:請參閱cygnus關於使用'Handler'的postDelayed方法的答案。 – Squonk 2012-08-07 21:16:06

相關問題