[英]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.