【问题标题】:(Android) Why won't invalidate() update my buttons immediately?(Android) 为什么 invalidate() 不会立即更新我的按钮?
【发布时间】:2010-05-10 22:05:08
【问题描述】:

我已经阅读了几个关于使用 invalidate() 以立即更新视图的论坛和示例,但我仍然不明白为什么我正在做的事情不起作用。下面的代码使用由“red”、“blue”、“green”和“yellow”定义的图像按钮。每次尝试更改按钮的外观时,我都会设置 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 个或这些块,分别是蓝色、绿色和黄色。

【问题讨论】:

    标签: android


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您也可以尝试使用 postInvalidate() 方法,这会导致 UI 线程中的无效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-24
        • 1970-01-01
        • 1970-01-01
        • 2016-06-11
        • 2021-01-28
        • 2013-01-18
        • 1970-01-01
        相关资源
        最近更新 更多