每次while/for循环迭代后如何等待一秒钟?

Posted

技术标签:

【中文标题】每次while/for循环迭代后如何等待一秒钟?【英文标题】:How to wait a second after each while/for loop iteration? 【发布时间】:2020-06-29 15:14:57 【问题描述】:

我尝试在 android Studio(语言:Java)中模拟一场足球比赛。我生成 90 个随机数。每次迭代必须代表比赛的一分钟。 (但现在测试时只有一秒钟)。每播放一分钟(在本例中为秒)后,必须在应用程序中调整播放分钟数和可能的分数。我已经测试了许多可以在 Internet 上找到的解决方案,例如随处可见的 Thread 解决方案。但是,这并没有达到我预期的结果。

预期输出:从 0 分钟开始并以 0-0 比分开始的应用,每秒将播放分钟数增加 1,如果进球,还会调整比分。

实际输出:白屏显示代码中指定的毫秒数,然后是游戏的“最终结果”。例如:90' 2-1

我已经尝试将try/catch 代码放在循环中的其他位置。我还用wait 替换了sleep。这总是产生相同的输出。谁能告诉我如何在屏幕上实时显示秒数,并且进球一落下,比分就会改变?

public void playLeagueMatch(Team team1, Team team2, TextView minuteTV,
                            TextView homeGoalsTV, TextView awayGoalsTV)

    int strength1 = team1.strength;
    int strength2 = team2.strength;
    int minutesPlayed = 0;
    double separation = Double.valueOf(strength1) / (Double.valueOf(strength1)+Double.valueOf(strength2)) * 100;

    int homeGoals = 0;
    int awayGoals = 0;

    for (minutesPlayed = 0; minutesPlayed < 91; minutesPlayed++) 
        String minuteName = Integer.toString(minutesPlayed);
        minuteTV.setText(minuteName + "'");

        int random = playMinute();

        if(random < 101)
            if(random <= separation)
                homeGoals++;
                homeGoalsTV.setText(Integer.toString(homeGoals));
            
            else
                awayGoals++;
                awayGoalsTV.setText(Integer.toString(awayGoals));
            
            try
                Thread.sleep(1000);
            
            catch(InterruptedException e) 
                throw new RuntimeException(e);
            
        
    

playMinute 函数:

public int playMinute()
    Random ran = new Random();

    int random = ran.nextInt(3500) + 1;

    return random;

【问题讨论】:

Thread 解决方案是什么,为什么它不起作用?那是你代码中的Thread.sleep() 吗? 当您在“playLeagueMatch”函数中等待时,绘制函数无法运行。匹配需要在单独的线程上运行。我可以推荐 AsyncTask。 @MaartenBodewes 是的,我的意思是 Thread 解决方案是 Thread.sleep()。或者 Thread.wait() 我也试过了。所以,实际上我只想每秒迭代一次 for 循环。现在它一次完成所有 90 次迭代 @KYL3R 我会看看 AsyncTask。感谢您的回复! 如果你不喜欢 AsyncTask,你可以简单地将 for 循环转换为普通函数并检查时间戳而不是使用睡眠。 【参考方案1】:

Thread.sleep(1000) 只会休眠 1 秒,因为 1 秒是 1000 毫秒。

Thread.sleep(1 * 60 * 1000) 替换一分钟

【讨论】:

另外,从 Java 8 开始,Duration.ofMinutes(1).toMillis() 在我看来更具可读性。【参考方案2】:

不要使用Thread.sleep() 是一种不好的做法。 您可以使用Countdown Timer 并在onTick 上运行您的playMinute()

new CountDownTimer(30000, 1000) 

    public void onTick(long millisUntilFinished) 
      Log.i("seconds remaining: " ,""+ millisUntilFinished / 1000);
    

    public void onFinish() 
         Log.i("Timer Finished");
      
.start();

【讨论】:

这对我来说似乎是部分解决方案,如果您指出它如何与 (G)UI 互操作,它将是完整的。 只需在 onTick 方法中更新你的 UI,如果你使用 Thread.sleep 你会停止 UI 线程并且什么都不会发生......只有 ANR 好的,所以(主)线程继续运行并且工具包没有任何同步问题? 不,这里是文档developer.android.com/reference/android/os/CountDownTimer 是的,我看过它,它确实使用了一个字段...虽然可耻地稀疏文档。

以上是关于每次while/for循环迭代后如何等待一秒钟?的主要内容,如果未能解决你的问题,请参考以下文章

如何在for循环中等待每次迭代并在nodeJS中将响应作为API响应返回

如何暂停循环几秒钟?

如何创建一个循环来检查每次迭代时是不是有新的 IBAction 输入?

web性能优化--算法优化

Linux C 编程学习第四天_循环语句_while_do/while_for_goto

如何在C中创建连续循环,其中循环的每次迭代在其内部循环的每次迭代中发生一次