【问题标题】:Sleep function not lagging in front of AI's turn睡眠功能在轮到 AI 之前不滞后
【发布时间】:2018-11-30 02:45:15
【问题描述】:

我需要在我的 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;
    }
}

【问题讨论】:

    标签: java android android-studio tic-tac-toe


    【解决方案1】:

    onClick 中使用Thread.sleep 时,实际上是阻塞了整个UI Thread,这将阻止Android Framework 重绘您的视图,因此您对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.removeCallbacks(比如activity的onDestroy)

    【讨论】:

    • 如果我想在tictacAI函数和turn函数之间有一个暂停怎么办?我尝试再次使用 v.postDelayed ,但它要求我将 v 设为最终变量。我应该如何在您提供的 postDelayed 中嵌套另一个 postDelayed?谢谢! @ZumiKua
    • 然后make v final,如果你不写v = ....之类的东西,final v就可以了。
    猜你喜欢
    • 1970-01-01
    • 2021-07-17
    • 2014-10-03
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    相关资源
    最近更新 更多