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

标签 android

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

最佳答案

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 - (Android) 为什么 invalidate() 不会立即更新我的按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2801877/

相关文章:

android - Recyclerview 中的媒体播放器全屏

android - 在 android 上使用路标绘制行车路线(谷歌地图、谷歌方向 api、json 解析、解码谷歌折线)

android - 我可以在一个 Activity 中有两个 AsyncTask 类吗(不同时工作)

android - 将Maven与AAR结合使用的Android项目没有Eclipse错误

android ffmpeg错误致命信号11

java - Android 应用程序文件无法附加并作为电子邮件发送

java - 错误 Gradle 同步失败 : For input string: "12" when apply plugin: 'com.google.gms.google-services'

android - 向 ListView 添加第二个过滤器

android - 如何管理不同设备的移动自动化?

java - 使用 rxjava 从实现可观察外部调用方法的自定义类发送事件