gpt4 book ai didi

java - sleep 功能不会落后于人工智能的轮次

转载 作者:行者123 更新时间:2023-12-02 10:32:12 33 4
gpt4 key购买 nike

我需要在我的人工智能在井字游戏板上玩之前添加一个人工暂停。但是,当我尝试使用 Thread.sleep 之类的东西时,在我有注释的位置,整个 onClick 函数会滞后。我所说的滞后是指 ((Button) v).setText("0") 不会在我使用 sleep 功能的时间内将按钮文本设置为 0,并且在计时器启动的那一刻,一切都会发生立即地。这就像滞后发生在函数的开头而不是注释所在的中间。有没有办法解决这个问题或解释为什么 sleep 功能没有滞后于它应该的位置?

public void onClick(View v) {

if(!((Button) v).getText().toString().equals("")){
return;
}

((Button) v).setText("0");
turn();

// Need a pause before tictacAI does anything

tictacAI("0", "X").setText("X");
turn();
if(won){
resetBoard();
won = false;
}
}

最佳答案

当在 onClick 中使用 Thread.sleep 时,您实际上阻塞了整个 UI Thread ,这将阻止 Android Framework 重绘您的 View ,因此您对 View 属性的更改将不会显示。

为了延迟执行,应该使用 View.postDelayed ,这会将您的操作发布到消息队列并稍后执行。

public void onClick(View v) {

if(!((Button) v).getText().toString().equals("")){
return;
}

((Button) v).setText("0");
turn();

// Need a pause before tictacAI does anything
v.postDelayed(new Runnable() {
@Override
public void run() {
tictacAI("0", "X").setText("X");
turn();
if(won){
resetBoard();
won = false;
}
}
}, 1000L); //wait 1 second
}

如果您使用的是 Java 1.8,则可以使用 lambda 代替匿名类。

另一个注意事项:
这个Runnable在执行之前不会被垃圾收集,所以长时间的间隔可能会导致你的整个 View 泄漏,这是非常糟糕。考虑使用View.removeCallbacks当不再需要此回调时(例如 Activity 的 onDestroy)

关于java - sleep 功能不会落后于人工智能的轮次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53550507/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com