2014-09-18 63 views
0

我正在製作簡單的測驗應用程序,現在有一個等待的問題。 當用戶點擊四個可能答案中的一個時,它應該變成橙色,兩秒後變成紅色或綠色(正確或錯誤答案)。這裏是我的代碼部分:Android:睡眠不適用於UI更改

public void clickButton(View v) { 
    changeButton(v, getResources().getDrawable(R.drawable.btn_orange)); 
    try { 
     //Thread.sleep(2000); 
     TimeUnit.SECONDS.sleep(2); 
    } catch (InterruptedException r) {} 

    changeButton(v, getResources().getDrawable(R.drawable.btn_red)); 
} 

我試過線程睡眠或睡眠TIMEUNIT,但在這兩種情況下,該按鈕將變爲默認的白色「點擊」階段,兩秒鐘後,紅色 - 完全跳過橙色部分。我檢查了其他顏色,所以這些顏色xml文件中沒有問題。問題可能在那個睡眠的某個地方,但我不知道我應該用什麼來延遲紅色,仍然是橙色。 thx諮詢

+2

你不應該在主線程上睡覺,看看View.postDelayed() – panini 2014-09-18 22:04:48

+0

其實你不得在UI線程上睡覺。 – rupps 2014-09-18 22:13:28

回答

1

@panini是正確的,你不應該睡在主線程,而是使用另一個線程,嘗試這樣的事情,沒有測試,所以我不知道它是否會工作,但是想法:

public void clickButton(final View v) { 
    changeButton(v, getResources().getDrawable(R.drawable.btn_orange)); 
    v.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      changeButton(v, getResources().getDrawable(R.drawable.btn_red)); 
     } 
    }, 2000); 


} 

也許你需要強制線程在UI中運行,無論如何嘗試。如果這不起作用,你總是可以使用一個AsyncClass。希望能幫助到你。

1

將延遲Runnables張貼到UI線程的簡單方法是將消息傳遞給UI線程的Handler

例如:

new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { 
     @Override 
     public void run() { 
     changeButton(v, getResources().getDrawable(R.drawable.btn_orange)); 
     }}, 2000);