Android中的同时链接线程

时间:2014-06-16 16:58:07

标签: android multithreading timer runnable countdowntimer

我正在开发一个数学游戏,向玩家展示排序4 + 3 = ?6 / 2 = ?的简单数学问题。向玩家提供4个可能的答案并单击一个。屏幕有两个按钮,一个带箭头,另一个带方形。

玩家选择他们认为正确的答案。如果答案是正确的,他们会得到一条消息。如果答案不正确,那么这个选择就会变灰,他们可以继续选择,直到他们做对了。

我想要两种游戏模式:练习和定时。

在练习模式中,玩家点击箭头按钮并获得一个新问题。这很好。

我也想要一个定时播放模式。当玩家按下箭头按钮时,计时器启动并出现第一个问题。如果他们做对了,他们会立即被问到一个新问题。同样,如果他们不正确,他们会不断询问,直到他们做对了。同时,应该有一个计时器倒计时。当计时器结束或玩家按下方形按钮时,播放停止。

我不知道如何进行定时游戏,其中有两个同步活动:玩游戏和计时器。

我包括伪代码而不是代码 - 代码很长。但如有必要,我可以发布整个代码。

更新


这是我天真的尝试。问题是我无法弄清楚如何在while循环中等待,直到玩家再次调用askQuestion()之前询问问题。也许它需要在一个单独的线程中并让while循环等待该线程返回。计时器会继续吗?我希望计时器同时运行到一个单独的任务,其中提出了一个问题 - >玩家回答问题 - >提出了一个新问题.....

  public void playTimed()
  {

//    Toast.makeText(getApplicationContext(), "in playPractice", Toast.LENGTH_SHORT).show();
    go_button.setOnClickListener(new OnClickListener()
    {       
      @Override
      public void onClick(View v)
      {  
        go_button.setEnabled(false);

        new CountDownTimer(10000, 1000) {

          public void onTick(long millisUntilFinished)
          {
            timer.setText("seconds remaining: " + millisUntilFinished / 1000);
          }

          public void onFinish()
          {
            timer.setText("done!");
            go_button.setEnabled(true);
            timer_done = true;
          }

       }.start();

       while(!timer_done)
       {
           askQuestion();
       }

      }
    });

  }

onCreate()
{
   -For all four answer buttons:
   answer_button.setOnClickListener(new OnClickListener()
   {
      @Override
      public void onClick(View v)
      {
         correct = checkAnswer(answer_button_id);
      }
   });

   -get intent extras to know which game
   -swith-case to play selected game

}

checkAnswer()
{
   if (correct)
   {
      // feedback
      handleRightAnswer();
   }
   else
   {
      // feedback
      handleWrongAnswer();
   }
}

askQuestion()
{
   -choose type of problem (+,-,*,/)
   -generate arguments and answer
   -create random answer list
      where one choice is correct
   -display problem
   -display answer choices
}

playTimed()
{
   -When player presses go_button,
   timer starts and first question
   appears. When correct answer is
   selected a new question immediately
   appears. Continues until timer runs
   out or player presses stop_button.
   Seconds left is displayed during play.
}

playPractice()
{
   //When player presses go_button
   // a new question appears.
   go_button.setOnClickListener(new OnClickListener()
   {
      @Override
      public void onClick(View v)
      {
        askQuestion();
      }
    });

}

enter image description here

1 个答案:

答案 0 :(得分:0)

正如Gabe Sechan所说,你可以使用计时器来更新计数器,然后当计数器达到0时,做一些事情。您还可以使用计时器更新TextView(以显示剩余时间)。

以下是我过去使用过的课程originally found here

public class UIUpdater{
    private Handler mHandler = new Handler(Looper.getMainLooper());
    private Runnable mStatusChecker;
    private int UPDATE_INTERVAL = 1000; //updates every second

    public UIUpdater(final Runnable uiUpdater) {
        mStatusChecker = new Runnable() {
            @Override
            public void run() {
                // Run the passed runnable
                uiUpdater.run();
                // Re-run it after the update interval
                mHandler.postDelayed(this, UPDATE_INTERVAL);
            }
        };
    }

    public UIUpdater(Runnable uiUpdater, int interval){
        this(uiUpdater);
        UPDATE_INTERVAL = interval;
    }

    public synchronized void startUpdates(){
        mStatusChecker.run();
    }

    public synchronized void stopUpdates(){
        mHandler.removeCallbacks(mStatusChecker);
    }
}

然后,在您想要更新计数器的方法中,您可以输入:

UIUpdater mUIUpdater = new UIUpdater(new Runnable() {
     @Override 
     public void run() {
        //method to update counter
 }
});

//to start the method:
mUIUpdater.startUpdates();

//to stop the method, ie, when counter == 0
mUIUpdater.stopUpdates();