睡眠功能不滞后于 AI 的轮到
Sleep function not lagging in front of AI's turn
我需要在我的 AI 在井字棋盘上轮到它之前添加一个人为的暂停。但是,当我尝试在我有评论的位置使用 Thread.sleep 之类的东西时,整个 onClick 函数都会滞后。我所说的滞后是指 ((Button) v).setText("0") 在我使用睡眠功能的时间和计时器启动的那一刻没有将按钮文本设置为 0,一切都会发生立即地。就像延迟发生在函数的开头而不是注释所在的中间。有没有办法解决这个问题或解释为什么睡眠功能没有滞后于预期的位置?
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 框架重绘您的视图,因此您更改视图的 属性不会显示。
为了延迟执行,你应该使用View.postDelayed,它会post你的动作到一个消息队列,稍后再执行。
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 而不是匿名 class。
另注:
这个 Runnable 在执行之前不会被垃圾回收,所以很长的间隔可能会导致你的整个视图泄漏,这是非常糟糕。当不再需要此回调时考虑使用 View.removeCallbacks(例如 activity 的 onDestroy)
我需要在我的 AI 在井字棋盘上轮到它之前添加一个人为的暂停。但是,当我尝试在我有评论的位置使用 Thread.sleep 之类的东西时,整个 onClick 函数都会滞后。我所说的滞后是指 ((Button) v).setText("0") 在我使用睡眠功能的时间和计时器启动的那一刻没有将按钮文本设置为 0,一切都会发生立即地。就像延迟发生在函数的开头而不是注释所在的中间。有没有办法解决这个问题或解释为什么睡眠功能没有滞后于预期的位置?
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 框架重绘您的视图,因此您更改视图的 属性不会显示。
为了延迟执行,你应该使用View.postDelayed,它会post你的动作到一个消息队列,稍后再执行。
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 而不是匿名 class。
另注:
这个 Runnable 在执行之前不会被垃圾回收,所以很长的间隔可能会导致你的整个视图泄漏,这是非常糟糕。当不再需要此回调时考虑使用 View.removeCallbacks(例如 activity 的 onDestroy)