2010-05-10 78 views
3

我已經閱讀了幾個論壇和使用invalidate()的例子,以便立即更新視圖,但我仍然不明白爲什麼我所做的不會工作。以下代碼使用由「紅色」,「藍色」,「綠色」和「黃色」定義的圖像按鈕。每次嘗試更改按鈕的外觀時,我都會設置1秒的延遲時間。請有人告訴我我做錯了什麼。(Android)爲什麼不立即更新我的按鈕invalidate()?

private void showPattern() { 
    if (correct == true) { 
     for (int k = 0; k < temp_basket.length; k++) { 
      if (temp_basket[k] == 0) { 
       red.setPressed(true); 
       red.invalidate(); 
       final Handler handler = new Handler(); 
       Timer t = new Timer(); 
       t.schedule(new TimerTask() { 
        public void run() { 
         handler.post(new Runnable() { 
          public void run() { 
           red.setPressed(false); 
           red.invalidate(); 
          } 
         }); 
        } 
       }, 1000); 

還有3個或這些塊之後是藍色,綠色和黃色。

回答

4

Invaliadate把一個重繪消息隊列

正如我在你的代碼中看到,有多個重畫後,其他發生在...操作系統將嘗試通過泡吧多個重繪消息置於一個優化渲染(在他們之間沒有其他消息的情況下)。

你可能想要做的是:

private Handler myHandler = new Handler() { 
    public void handleMessage(Message msg) 
    { 
     switch(msg.what) { /* do your work */ } 
    } 
}; 

Message msg = Message.obtain(myHandler); 
msg.what = <some-number>; 
msg.obj = <your-data-to-process> 

if(myHandler.containsMessage(<same-number>) { 
    myHandler.removeMessages(<same-number>); 
} 
myHandler.sendMessage(msg); 
1

您也可以嘗試使用postInvalidate()方法,這將導致在UI線程的無效。