我有一个纸牌游戏,其中的游戏会自动从一个玩家传到另一个游戏。有3个非用户播放器,播放流从一个到下一个,而无需用户干预(每秒钟(由用户指定))。
我有2种控制流程的方法:
awaitTurn,用于等待转弯开始
实际转弯开始时执行doTurn
它们都在同一个类中。
每个玩家都有自己的类实例。
玩家完成回合后,它将调用下一个玩家的“ awaitTurn()”,依此类推。
3位自动玩家轮到自己之后,然后将控制权发送给用户的“ awaitTurn()”,该用户实际上不执行任何操作并允许用户进行自己的轮到。
为了暂停,我编写了以下代码:
public void awaitTurn()
{
GameActivity.thisActivity.displayHideCont(View.VISIBLE);
if (GameActivity.settings.getPauseTimeBetweenTurns() > 0){
startNextPlayerTurn = new Runnable() {public void run() {doTurn();}};
if (handler == null)
handler = new Handler();
else
handler.removeCallbacks(startNextPlayerTurn);
int extraDelay = GameActivity.settings.getCardAnimationTime();
handler.postDelayed(startNextPlayerTurn,
(GameActivity.settings.getPauseTimeBetweenTurns())*1000 + extraDelay);
}
return;
}
在
doTurn
中,我有:public void doTurn() {
if (startNextPlayerTurn!=null) // just in case we are still pausing
handler.removeCallbacks(startNextPlayerTurn);
...
}
因此,最大的问题是,我是否在这里构建一个无限深度的线程?
最佳答案
您没有在应用程序中创建线程。您可以在主UI线程中运行所有功能(假设处理程序是在UI线程中创建的)。
这是发生了什么:
对handler.postDelayed(runnableX, delayX)
的调用将runnableX
放入UI队列,并且将在delayX
之后进行处理。
时间到了,UI线程的循环将使用runnableX
并运行它。
如果调用handler.removeCallbacks(runnableX)
,则所有带有runnableX
的待处理邮件将从队列中删除(并且不会运行)。
如果您多次调用handler.postDelayes(runnableX, delayX)
,则您的runnableX
将被多次调用。但是每次它将在UI线程上运行。
不幸的是,无法检查您的runnableX
是否已发布到队列中。