繁体   English   中英

Android Studio上的计时器问题

[英]Timer Issue on Android Studio

我在测验游戏中遇到计时器问题。 本质上,这是一个选择题游戏,玩家在每个问题上都有时机。 当应用程序启动并且播放器看到第一个问题时,我启动了计时器。 我的问题是,即使我在onclick方法上将计时器重置为30秒,如果播放器正确或错误地回答了问题,计时器也会开始提供随机值。 如何使计时器从30秒开始计时并正常倒计时。

public class MainActivity extends AppCompatActivity {

    //Views
    TextView questionTextView;
    TextView mscoreTextView;
    TextView mtimerTextView;
    Button mchoice1;
    Button mchoice2;
    Button mchoice3;
    Button mchoice4;


    //Constructors
    private questions Question = new questions();
    private Answers cAnswers = new Answers();
    private choices Choices = new choices();

    //Variables
    private int questionNumber = 0;
    private int mScore = 0;
    private String correctAnswer;


    public void onClick(View view) {

        Button answer1 = (Button) view;

        if(answer1.getText() == correctAnswer) {

            mScore = mScore + 1;
            Toast.makeText(getApplicationContext(), "CORRECT!!", Toast.LENGTH_SHORT).show();
            mtimerTextView.setText("30s");
            runTimer();

        } else {

            Toast.makeText(getApplicationContext(), "WRONG!!", Toast.LENGTH_SHORT).show();
            mtimerTextView.setText("30s");
            runTimer();

        }

        updateScore(mScore);
        updateUI();
    }


    private void updateScore(int points) {

        mscoreTextView.setText("" + points + "/" + Question.getLength());
    }


    public void runTimer() {

        new CountDownTimer(30100, 1000) {

            @Override
            public void onTick(long millisUntilFinished) {

                String tick = String.valueOf(millisUntilFinished/1000 + "s");
                mtimerTextView.setText(tick);
            }

            @Override
            public void onFinish() {

                Toast.makeText(getApplicationContext(), "TIME RAN OUT!!", Toast.LENGTH_LONG).show();
                mtimerTextView.setText("0s");
                updateUI();
            }
        }.start();


    }


    private void updateUI () {

        if (questionNumber < Question.getLength()) {
            questionTextView.setText(Question.getQuestion(questionNumber));
            mchoice1.setText(Choices.getChoices(questionNumber, 1));
            mchoice2.setText(Choices.getChoices(questionNumber, 2));
            mchoice3.setText(Choices.getChoices(questionNumber, 3));
            mchoice4.setText(Choices.getChoices(questionNumber, 4));
            correctAnswer = cAnswers.getAnswer(questionNumber);

            questionNumber ++;

        } else {


            Toast.makeText(getApplicationContext(), "This is the last question", Toast.LENGTH_LONG).show();
            //Intent intent = new Intent(MainActivity.this, HighScoreActivity.class);
            //intent.putExtra("Score", mScore);
            //startActivity(intent);


        }

        runTimer();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        questionTextView = (TextView) findViewById(R.id.questionTextView);
        mchoice1 = (Button) findViewById(R.id.choice1);
        mchoice2 = (Button) findViewById(R.id.choice2);
        mchoice3 = (Button) findViewById(R.id.choice3);
        mchoice4 = (Button) findViewById(R.id.choice4);


        mtimerTextView = (TextView) findViewById(R.id.timerTextView);
        mscoreTextView = (TextView) findViewById(R.id.scoreTextView);

        updateScore(mScore);
        updateUI();
    }
}

关键是,您永远不会真正取消启动的计时器。 随之而来的是,每次您需要计时器时,您都可以创建一个新计时器,这不是必需的。 以下必须解决您的问题:

您需要将CountDownTimer存储在类字段中:

private CountDownTimer timer;

然后,您可以在应用程序启动时创建一次:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
    ...
    timer = createTimer();
    ...
}

CreateTimer函数:

public void createTimer() {
    timer = new CountDownTimer(30100, 1000) {

        @Override
        public void onTick(long millisUntilFinished) {
            ...
        }
        @Override
        public void onFinish() {
            ...
        }
}

}

因此,当您需要运行计时器时,只需调用:

timer.start();

当用户给出答案时,您需要先取消计时器,然后再次启动它:

public void onClick(View view) {
    ...
    timer.cancel();
    timer.start();
    ...
}

另外:您的OnClick()方法中有一些重复的代码。 无论用户的回答正确与否,您都需要运行timer并将值设置为mtimerTextView ,因此基本上您想在if-else构造之外进行操作。

您必须在CountDownTimer类中定义一个变量。

public void runTimer() {

        new CountDownTimer(30100, 1000) {
        private int time = 30;

            @Override
            public void onTick(long millisUntilFinished) {
                mtimerTextView.setText(time--+"s");
            }

            @Override
            public void onFinish() {

                Toast.makeText(getApplicationContext(), "TIME RAN OUT!!", Toast.LENGTH_LONG).show();
                mtimerTextView.setText("0s");
                updateUI();
            }
        }.start();


    }

可取消计时器

如果要取消计时器,则必须将其定义为全局变量。

private CountDownTimer timer; // global variable

通过调用下面的runTimer()方法启动计时器。

public void runTimer() {

   timer = new CountDownTimer(30100, 1000) {
        private int time = 30;

            @Override
            public void onTick(long millisUntilFinished) {
                mtimerTextView.setText(time--+"s");
            }

            @Override
            public void onFinish() {

                Toast.makeText(getApplicationContext(), "TIME RAN OUT!!", Toast.LENGTH_LONG).show();
                mtimerTextView.setText("0s");
                updateUI();
            }
        }.start();


    }

您可以通过调用以下方法取消计时器。

public void stopTimer(){
   if(timer != null){
    timer.cancel();
  }
}

希望这会有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM