1

所以我有一个运行简单的蛇和梯子游戏的活动,我想让玩家点击一个按钮并移动,随后计算机移动。我的问题是,一旦玩家移动,计算机就会立即移动。

相反,我希望活动在计算机移动之前等待。我环顾四周,发现等待涉及使用线程,但我未能在我的应用程序崩溃的情况下实现它

我尝试声明一个线程:

final Runnable runnable = new Runnable()  {
        @Override
        public void run()
        {
            while (true)
            {

                try
                {
                    Thread.sleep(5000);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }

        }
    };

    Thread thread= new Thread(runnable);

我的按钮的 onClick() 方法:

Button rollButton = (Button) (findViewById(R.id.rollButton));
    rollButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //executes only if current player is a human
            if(GAME_BOARD.getCurrentPlayer().isHuman()) {

                GAME_BOARD.rollDie(); // rolls the die
                showDie(GAME_BOARD); // displays die on screen      
                GAME_BOARD.move();  // moves the player and sets next player as current player
                playerTurn.setText(GAME_BOARD.getCurrentPlayer().getName() +"'s turn");// sets TextView to display who's player's turn it is
                thread.start();  

                if(!GAME_BOARD.getCurrentPlayer().isHuman()) {

                    GAME_BOARD.rollDie();
                    showDie(GAME_BOARD);
                    GAME_BOARD.move();
                    playerTurn.setText(GAME_BOARD.getCurrentPlayer().getName() +"'s turn");                 
                }   
            }

        }
    });

再说一次,我的问题是,我该如何做到,以便在第二个 if 语句执行之前,活动等待,比如 4 秒?

4

4 回答 4

3

你可以使用一个Handler.postDeleayed. 您必须提供一个 Runnable 来执行和以毫秒为单位的延迟时间。将Runnable在 UI 线程上执行

于 2013-07-04T08:27:43.013 回答
3

延迟一段时间后,您可以使用 Handle 发布在 runnable 中定义的任务

使用这个
内部活动定义

Handler hand = new Handler(); 

并像这样在可运行中定义您的任务

Runnable run = new Runnable() { 
    @Override 

    public void run() { 

      **your Task here.......**
    } 

}; 

在点击事件中

btnStartShow.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            hand.postDelayed(run,3000); // For delay three seconds
        }
    });

还可以通过在适当的位置调用以下句子来删除所有待处理的消息

hand.removeCallbacksAndMessages(null); 
于 2014-02-08T08:09:16.480 回答
1

使用倒数计时器:

CountDownTimer timer = new CountDownTimer(4000, 1000) {
            @Override
            public void onFinish() {
                *function containing the second statement*
            }

            @Override
            public void onTick(long millisLeft) {
                // not ticking
            }
        };

并在点击监听器的 onClick 方法中使用:

timer.start();
于 2013-07-04T08:18:36.297 回答
0

试试下面的,

rollButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                // whatever you would like to implement when or after clicking rollButton
            }
        };
        rollButton.postDelayed(runnable, 5000); //Delay for 5 seconds to show the result
}
于 2014-02-08T07:47:25.717 回答