Android中的线程使用是否是无限的

时间:2011-06-04 21:18:33

标签: android concurrency

我有一个纸牌游戏,其中游戏自动从玩家传递到游戏。每个秒数(由用户指定),有3个非用户播放器和播放流,从一个到另一个没有用户干预。

我有两种控制流程的方法:

  1. 用于等待转弯开始的awaitTurn
  2. 在实际转弯开始时转动
  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);
        ...
    }
    

    所以,最重要的问题是,我是否在这里构建了一个无限深度的线程,或者不是。

2 个答案:

答案 0 :(得分:1)

您不在应用程序中创建线程。您在主UI线程中运行所有函数(假设处理程序是在UI线程中创建的)。

以下是发生的事情:

  1. handler.postDelayed(runnableX, delayX)的调用将runnableX置于UI队列中,并将在delayX之后处理。
  2. 当时机到来时,UI线程的循环需要runnableX并运行它。
  3. 如果您致电handler.removeCallbacks(runnableX),那么runnableX的所有待处理邮件都会从队列中删除(并且不会运行)。

    如果您对handler.postDelayes(runnableX, delayX)进行多次通话,则会多次调用您的runnableX。但每次它都将在UI线程上运行。

    很遗憾,无法检查您的runnableX是否已经过帐到队列。

答案 1 :(得分:0)

我想我不会让玩家调用另一个玩家的方法,我会让某个类型的“玩家经理”告诉玩家什么时候轮到他,并且如果有必要,让玩家告诉经理什么时候它已经完成了。