(Android)为什么不使invalidate()立即更新我的按钮?

我已经阅读了一些有关使用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);

在这之后有3个或多个块,分别是蓝色,绿色和黄色.

解决方法:

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);

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...