每次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 输入?