我正在尝试创建一个在给定时间内运行x次的计时器。示例:10是计时器应运行的秒数。 3是10秒计时器应该完成的次数。
理想情况下,它会在第一次开始10秒(或任何可变时间)倒计时。 然后发出声音。 然后再次开始倒计时(第二次)。 然后发出声音。 然后再次开始倒计时(第三次)。 然后播放声音并停止执行并执行其他操作。
到目前为止,我已经创建了一个调用timer方法的for循环,但它似乎只运行了1x。谁能看到我做错了什么?
private void startRound(){
for ( int i = 0; i < mRounds; i++){
startTimer();
}
}
private void startTimer(){
CountDownTimer = new CountDownTimer(mTimeLeft, 1000) {
@Override
public void onTick(long millisUntilFinished) {
mTimeLeft = millisUntilFinished;
updateCountDownText();
}
@Override
public void onFinish() {
textView.setText("FINISHED");
mTimerRunning = false;
mButtonStartPause.setText("START");
mButtonStartPause.setVisibility(View.INVISIBLE);
;
mButtonReset.setVisibility(View.VISIBLE);
}
}.start();
mTimerRunning = true;
mButtonStartPause.setText("Pause");
mButtonReset.setVisibility(View.INVISIBLE);
}
答案 0 :(得分:0)
这是因为 for循环不等待 CountDownTimer 完成。并立即启动3个倒计时器〜 对于重复简单的周期性任务,建议在Android中使用Handler。 请参阅此link。
Android中的CountDownTimer类本身在内部使用Handler。
您可以创建一个处理程序并将runnable传递给它。 像这样:
int numberOfTimers = 3;
int numberOfSeconds = 10;
Handler timerHandler = new Handler();
/**
* Inner class that implements {@link Runnable} to check the timer updates.
*/
class RunnableTimer implements Runnable {
int numberOfSeconds;
int secRemaining;
int timesRemaining;
RunnableTimer(int numberOfSeconds, int timesRemaining) {
this.numberOfSeconds = numberOfSeconds;
this.timesRemaining = timesRemaining;
secRemaining = numberOfSeconds;
}
@Override
public void run() {
if(secRemaining>0){
--secRemaining; // decrease the remaining seconds by 1.
updateText() // upadate the textView with remaining seconds.
handler.postDelayed(this,1000); // repeat the runnable after 1 sec
}else {
timesRemaining--; // decrease the number of timer by 1 when countdown finishes
updateTextWhenTimerFinished() // update the text when the countdown finishes
playSound(); // play the sound
// check if the timer has to run more times
if( timesRemaining > 0 ){
secRemaining = numberOfSeconds; // re-initialize the timer seconds
handler.postDelayed(this,1000); // repeat the runnable after 1 sec
}
}
}
RunnableTimer timerRunnable = new RunnableTimer(numberOfSeconds, numberOfTimers);
//finally pass the runnable in the handler to start the timer
timerHandler.post(timerRunnable);
不要忘记在活动的onStop()中调用timerHandler.removeCallbacks(timerRunnable)。