好的,首先,永远不要像你正在做的那样在繁忙的循环中实现延迟。我可以看到它来自哪里——我猜 palm Pilot 是一个没有内置 sleep() 功能的单进程设备,但在多进程设备上,像这样的繁忙循环只会带来整个处理器跪了。它会耗尽您的电池,阻止正常的系统任务正常运行,减慢其他程序或完全停止它们,使设备无响应,甚至可能导致它在您的手中变热。
您正在寻找的电话是 Thread.sleep()。您需要进行设置以捕获在您睡觉时发生的任何中断异常。
其次,使用基于事件的用户界面,如 Android(或几乎任何现代 GUI 系统),您永远不想在 UI 线程中休眠。正如其他海报所提到的,这还将冻结整个设备并导致 ANR(活动无响应)崩溃。最重要的是,这些小冻结完全破坏了用户体验。
(例外:如果您睡眠的时间间隔足够短,用户可能不会注意到,您可以侥幸逃脱。1/4 秒可能没问题,尽管根据情况它可能会使应用程序卡顿。)
不幸的是,如果您正在做的是将基于循环的应用程序移植到基于事件的系统中,那么就没有干净而优雅的方式来做您想做的事。
也就是说,正确的过程是在您的 UI 线程中创建一个处理程序并向其发送延迟消息。延迟消息将“唤醒”您的应用程序并触发它执行延迟后将要执行的任何操作。
像这样的东西:
View gameBoard; // the view containing the main part of the game
int gameState = 0; // starting
Handler myHandler;
public void onCreate(Bundle oldState) {
super.onCreate(oldState);
...
gameBoard = findViewById(R.layout.gameboard);
myHandler = new Handler();
...
}
public void onResume() {
super.onResume();
displayStartingScreen();
myHandler.postDelayed(new Runnable() {
gotoState1();
}, 250);
}
private void gotoState1() {
// It's now 1/4 second since onResume() was called
displayNextScreen();
myHandler.postDelayed(new Runnable() {
gotoState2();
}, 250);
}
...