我已经阅读了一些有关使用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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。