1

我知道 java/androidStudio 中的Thread.sleep()andpostDelayed()函数。但这里有一个问题,我正在创建一个西蒙说游戏的复制品。

我创建了一个generateSequence()函数,将 1-9 的数字随机放入一个名为sequence. 之后,我需要显示这些序列,这基本上会改变 textView 的背景一秒钟,然后使用该postDelayed()函数返回其原始背景。

这是我的代码:

private void displaySequence(){
    for(int i = 0; i < sequence.size(); i++) {
        if(sequence.get(i) == 1) {
            viewCard11.setBackgroundResource(R.drawable.text_view_circle4);
            proceed = false;
            handler.postDelayed(() -> {
                viewCard11.setBackgroundResource(R.drawable.text_view_circle3);
                proceed = true;
            }, 1000);
        } 
        else if(sequence.get(i) == 2) {} 
        else if(sequence.get(i) == 3) {} 
        else if(sequence.get(i) == 4) {} 
        else if(sequence.get(i) == 5) {} 
        else if(sequence.get(i) == 6) {} 
        else if(sequence.get(i) == 7) {} 
        else if(sequence.get(i) == 8) {} 
        else if(sequence.get(i) == 9) {}
        while(!proceed) {}
    }
}

但问题postDelayed()在于,只有函数内部的任何内容都会被延迟。这意味着如果它sequence有 2 个元素,它将同时闪烁背景。for循环不会等待 完成它应该做的任何postDelayed事情,而是递增并继续放置下一个postDelayed

为了解决这个问题,我尝试使用proceed布尔变量作为延迟。我所做的是,在我们调用 之前postDelayed,我设置proceedfalse。由于它不会等待postDelayed(),它将转到下一行代码,即while循环。

通过设置proceed为假,我用它来创建一个无限循环。但是这个无限循环会被已完成postDelayed()的as打断,proceed在里面设置为true,然后代码就可以继续for循环了。

但我不确定为什么它根本不起作用。当我运行代码时,它只显示一个空白屏幕。似乎问题存在于无限while循环中并且postDelayed()无法更新proceed变量。

我尝试将Thread.sleep(1000)其用作 的替代品postDelayed,但在启动过程中,无论参数传递到多长时间,程序都只是显示白色背景Thread.sleep()

我已经用尽了我的选择,我希望有人有更好的主意。谢谢你。

4

1 回答 1

1

循环不会等待 postDelayed,因为 postDelayed 中的内容是异步发生的。这意味着它在第二个线程上独立于 UI 线程工作。您要完成的是让 UIthread 等待一段时间,而不是在特定时间后启动另一个线程。您可以尝试以这种方式使用处理程序:

Handler handler=new Handler()
{

public void handleMessage(Message msg)
{
   if(msg.what==0)
{
 viewCard11.setBackgroundResource(R.drawable.text_view_circle3);
      proceed = true;
}

}
};

然后你可以像这样使用处理程序:

handler.postDelayed(() -> 
{            
 //does nothing just waits 1 second and then send empty message
 handler.sendEmptyMessage(0)
}, 1000);
于 2020-12-17T08:45:52.660 回答