我有一个纸牌游戏,其中游戏自动从玩家传递到游戏。每个秒数(由用户指定),有3个非用户播放器和播放流,从一个到另一个没有用户干预。
我有两种控制流程的方法:
他们都属于同一个班级。 每个玩家都有自己的班级实例。
在玩家完成转弯之后,它会调用下一个玩家的“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);
...
}
所以,最重要的问题是,我是否在这里构建了一个无限深度的线程,或者不是。
答案 0 :(得分:1)
您不在应用程序中创建线程。您在主UI线程中运行所有函数(假设处理程序是在UI线程中创建的)。
以下是发生的事情:
handler.postDelayed(runnableX, delayX)
的调用将runnableX
置于UI队列中,并将在delayX
之后处理。runnableX
并运行它。如果您致电handler.removeCallbacks(runnableX)
,那么runnableX
的所有待处理邮件都会从队列中删除(并且不会运行)。
如果您对handler.postDelayes(runnableX, delayX)
进行多次通话,则会多次调用您的runnableX
。但每次它都将在UI线程上运行。
很遗憾,无法检查您的runnableX
是否已经过帐到队列。
答案 1 :(得分:0)
我想我不会让玩家调用另一个玩家的方法,我会让某个类型的“玩家经理”告诉玩家什么时候轮到他,并且如果有必要,让玩家告诉经理什么时候它已经完成了。