我有一个纸牌游戏,其中的游戏会自动从一个玩家传到另一个游戏。有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是否已发布到队列中。

10-08 16:50