Android (安卓)为什么赢了';t invalidate()是否立即更新我的按钮?

Android (安卓)为什么赢了';t invalidate()是否立即更新我的按钮?,android,Android,我已经阅读了几个论坛和示例,介绍如何使用invalidate()立即更新视图,但我仍然不明白为什么我所做的不会起作用。下面的代码使用由“红色”、“蓝色”、“绿色”和“黄色”定义的图像按钮。我在每次尝试更改按钮外观之间设置了1秒的延迟。请有人告诉我我做错了什么 private void showPattern() { if (correct == true) { for (int k = 0; k < temp_basket.length; k++) {

我已经阅读了几个论坛和示例,介绍如何使用invalidate()立即更新视图,但我仍然不明白为什么我所做的不会起作用。下面的代码使用由“红色”、“蓝色”、“绿色”和“黄色”定义的图像按钮。我在每次尝试更改按钮外观之间设置了1秒的延迟。请有人告诉我我做错了什么

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);
private void showPattern(){
if(correct==true){
对于(int k=0;k

在此块之后还有3个或更多的蓝色、绿色和黄色块。

Invalidate将重新绘制的消息放入队列中

正如我在您的代码中看到的,有多个重画相继发生……操作系统将尝试通过将多个重画消息合并为一个来优化渲染(前提是它们之间没有其他消息)

您可能想做的是:

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);
private Handler myHandler=new Handler(){
公共无效handleMessage(消息消息消息)
{
切换(msg.what){/*做你的工作*/}
}
};
Message msg=Message.get(myHandler);
msg.what=;
msg.obj=
if(myHandler.containsMessage(){
myHandler.removeMessages();
}
发送消息(msg);

您还可以尝试使用postInvalidate()方法,这将导致UI线程中的invalidate