Android测验游戏 - 每个问题的倒数计时器

时间:2012-07-18 00:22:10

标签: java android timer countdown

我使用以下教程创建了Android测验应用:http://automateddeveloper.blogspot.co.uk/2011/06/getting-started-complete-android-app.html

对于每个问题,用户只有20秒的时间来回答它。如果他/她在20秒内未能回答,则会弹出AlertDialog,游戏将终止。

为此,我在OnCreate的{​​{1}}方法中添加了一个计数器:

QuestionActivity class

计数器在屏幕上正常显示和功能。在回答问题后,活动转到下一个问题,计数器再次重置为20秒。

问题

测验有15个问题,在回答3或4个问题后,应用程序崩溃,我收到以下错误:

final TextView myCounter = (TextView) findViewById(R.id.countdown);
    new CountDownTimer(20000, 1000) {

        @Override
        public void onFinish() {
            timeUp();
        }

        @Override
        public void onTick(long millisUntilFinished) {
            myCounter.setText("Time left: "
                    + String.valueOf(millisUntilFinished / 1000));
        }

    }.start();


public void timeUp() {

    AlertDialog.Builder builder = new AlertDialog.Builder(
            QuestionActivity.this);
    builder.setTitle("Times up!")
            .setMessage("Game over")
            .setCancelable(false)
            .setNeutralButton(android.R.string.ok,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            QuestionActivity.this.finish();
                        }
                    });
    AlertDialog alert = builder.create();
    alert.show();
}

我认为这与07-18 00:49:05.530: E/AndroidRuntime(4867): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@41533a80 is not valid; is your activity running? 有关。我在Stackoverflow上查找了这个错误代码,流行的解决方案是在构建AlertDialog时将ActivityName.this作为上下文传递。

不幸的是,这并没有解决问题。

我相信计数器正在为整个活动设置20秒的时间限制。我的要求是每个问题20秒。

但是,当用户按下“AlertDialog按钮并且活动移至下一个问题时,计数器将重置为20秒。

当用户按下Next按钮时,我应该重置计数器吗?以下是Next按钮

OnClickListener代码
Next

任何人都可以帮我编写解决问题的方法吗?

以下是if (currentGame.isGameOver()) { Intent i = new Intent(this, EndgameActivity.class); startActivity(i); finish(); } else { Intent i = new Intent(this, QuestionActivity.class); startActivity(i); SHOULD I ADD SOMETHING HERE? finish();

中的所有代码
QuestionActivity.class

1 个答案:

答案 0 :(得分:6)

我认为当你尝试进行对话时,活动在某个时刻不再存在(可能是在CountDownTimer接近结束时?!?)。

无论如何,我认为为每个问题完成并开始相同的活动并不是一个好主意,而是可以使用当前活动并简单地重启计时器。例如:

public class QuestionActivity extends SherlockActivity implements
    OnClickListener {

   private CountDownTimer mCountDown;

   @Override
   public void onCreate(Bundle savedInstanceState) {
      // ...
      mCountDown = new CountDownTimer(20000, 1000) {

        @Override
        public void onFinish() {
            // myCounter.setText("Time up!");
            timeUp(context);
        }

        @Override
        public void onTick(long millisUntilFinished) {
            myCounter.setText("Time left: "
                    + String.valueOf(millisUntilFinished / 1000));
        }
      }.start();
      // ... 

并在onClick回调中设置新问题,停止旧计时器并重新启动新计时器:

//check if end of game
if (currentGame.isGameOver()) {
    Intent i = new Intent(this, EndgameActivity.class);
    startActivity(i);
    finish();
} else {
    if (mCountDown != null) { 
       mCountDown.cancel();
    }  
    currentQ = currentGame.getNextQuestion();
    setQuestions();
    mCountDown = new CountDownTimer(20000, 1000) {

        @Override
        public void onFinish() {
            // myCounter.setText("Time up!");
            timeUp(context);
        }

        @Override
        public void onTick(long millisUntilFinished) {
            myCounter.setText("Time left: "
                    + String.valueOf(millisUntilFinished / 1000));
        }
    }.start();  
}

此外,在Dialog Button的回调中,我会在完成Dialog之前关闭Activity

((AlertDialog) dialog).dismiss();
QuestionActivity.this.finish();