Java 睡眠功能不落后于AI的轮次

Java 睡眠功能不落后于AI的轮次,java,android,android-studio,tic-tac-toe,Java,Android,Android Studio,Tic Tac Toe,我需要在我的AI在tic-tac趾板上播放之前添加一个人工暂停。但是,当我尝试在我有注释的位置使用类似Thread.sleep的东西时,整个onClick函数都会滞后。我所说的滞后是指,对于我使用睡眠功能的时间量和计时器启动的那一刻,按钮v.setText0没有将按钮文本设置为0,一切都会立即发生。这就像延迟发生在函数的开头,而不是注释所在的中间。有没有办法解决这个问题,或者解释为什么睡眠功能没有落后于预期的状态 public void onClick(View v) { if(!((

我需要在我的AI在tic-tac趾板上播放之前添加一个人工暂停。但是,当我尝试在我有注释的位置使用类似Thread.sleep的东西时,整个onClick函数都会滞后。我所说的滞后是指,对于我使用睡眠功能的时间量和计时器启动的那一刻,按钮v.setText0没有将按钮文本设置为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时,实际上是在阻止整个进程,这将阻止Android Framework重新绘制视图,因此不会显示对视图属性的更改

为了延迟执行,您应该使用,它将把您的操作发布到消息队列,稍后再执行

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
}
如果您使用的是Java1.8,那么可以使用lambda而不是匿名类

另一项说明:
这个Runnable在执行之前不会被垃圾收集,所以很长的时间间隔可能会导致整个视图泄漏,这是非常糟糕的。考虑使用这个回调时不需要任何类似的活动的破坏,例如

如果我想在TigTAAI函数和回合函数之间停顿,那该怎么办?我再次尝试使用v.postdayed,但它要求我将v作为最终变量。我应该如何在您提供的postDelayed中嵌套另一个postDelayed?谢谢@Zumikuaten将v设为final,如果您没有编写类似于v=..的内容,那么final v就可以了。