CountDownTimer bei onClick stoppen und neuen Countdown starten

  • 2 Antworten
  • Letztes Antwortdatum
R

RobNeck

Ambitioniertes Mitglied
3
Nabend,

ich versuche mich gerade daran, meiner QuizApp eine Zeitbegrenzung für jede Frage zu verpassen. Dazu nutze ich einen CountDownTimer.

Die Logik ist aktuell folgende:
Frage beantwortet -> nächste Frage, Timer neustarten
ODER
Zeit abgelaufen -> nächste Frage, Timer neustarten

letzteres klappt wunderbar, ersteres leider noch gar nicht. Ich kann zwar einen neuen Timer starten, allerdings laufen dann zwei Timer gleichzeitig, was im TextView ziemlich bescheiden aussieht und letztlich zu einem Crash führt. Mit cancel() nach einen Click auf "Next" führe ich leider ebenfalls jedes mal einen Crash herbei. Jemand ne Idee, wo der Fehler liegt?

Code:
package com.jensjensen.quiz;

import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

public class QuizActivity extends Activity {
	List<Question> quesList;
	int score = 0;
	int qid = 0;
	int tick = 0;
	Question currentQ;
	TextView questionTextView;
	RadioButton btnOptionA, btnOptionB, btnOptionC;
	Button btnNext;
	TextView time;
	CountDownTimer countDownTimer;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_quiz);
		DbHelper db = new DbHelper(this);
		quesList = db.getAllQuestions();
		currentQ = quesList.get(qid);
		questionTextView = (TextView)findViewById(R.id.question);
		btnOptionA = (RadioButton)findViewById(R.id.optionA);
		btnOptionB = (RadioButton)findViewById(R.id.optionB);
		btnOptionC = (RadioButton)findViewById(R.id.optionC);
		btnNext = (Button)findViewById(R.id.nextButton);
		final TextView time = (TextView)findViewById(R.id.time);
		
		setQuestionView();
		
		btnNext.setOnClickListener(new View.OnClickListener() {		
			@Override
			public void onClick(View v) {

				RadioGroup grp = (RadioGroup)findViewById(R.id.radioGroup1);
				RadioButton answer = (RadioButton)findViewById(grp.getCheckedRadioButtonId());
				if(currentQ.getAnswer().equals(answer.getText()))
				{
					score++;
				}
				if(qid<5){					
					currentQ=quesList.get(qid);
					setQuestionView();
				}else{
					Intent intent = new Intent(QuizActivity.this, ResultActivity.class);
					Bundle b = new Bundle();
					b.putInt("score", score); //Your score
					intent.putExtras(b); //Put your score to your next Intent
					startActivity(intent);
					finish();
				}
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.quiz, menu);
		return true;
	}
	
	private void setQuestionView()
	{
		questionTextView.setText(currentQ.getQuestion());
		btnOptionA.setText(currentQ.getOptionA());
		btnOptionB.setText(currentQ.getOptionB());
		btnOptionC.setText(currentQ.getOptionC());
		qid++;
		
		new CountDownTimer(8000, 1000) {
			 public void onTick(long millisUntilFinished) {
			     mTime.setText("Time: " + millisUntilFinished / 1000);
			 }
			 public void onFinish() {
				 btnNext.performClick();
			 }
			}.start();
	}
}
 
Du solltest dir vielleicht den Timer in einer variable merken.
Dann kannst du den Timer vorher beenden bevor du einen neuen baust.

Aktuell läuft der ja als anonyme klasse und du kannst nach dem starten nichts mehr damit machen.
 
Dummer Fehler, absolut richtig.
Ich habe den gesamten CountDownTimer jetzt in eine eigene Klasse gepackt. Nun funktioniert auch cancel(); wie gewünscht. Danke!
 
Zurück
Oben Unten