Android数学测试APP中CountDownTimer重玩按钮无法重置问题
解决CountDownTimer无法重置的问题
我看到你在开发这款数学测试APP时,遇到了重玩按钮点击后计时器无法正常重置的问题,咱们来一步步搞定它!
问题根源分析
preostaloVreme变量未重置:第一次倒计时结束后,preostaloVreme会被更新为0,当你点击重玩调用startovanjeTajmera()时,传入的是已经归零的preostaloVreme,导致计时器直接触发onFinish(),看起来就像没启动一样。- 旧计时器未取消:如果不取消之前的
countDownTimer实例,可能会出现多个计时器同时运行的情况,引发逻辑混乱甚至内存泄漏。
解决方案
我们需要在重玩时做三件关键的事:重置剩余时间、取消旧计时器、重新初始化题目和UI状态。
修改igrajPonovo()方法
public void igrajPonovo(View view) { // 1. 重置计数变量 brojPokusaja = 0; brojPogodnjenihOdgovora = 0; krajnjiRezultat.setText(brojPogodnjenihOdgovora + " / " + brojPokusaja); // 2. 重置剩余时间为初始值30秒 preostaloVreme = 30000; // 3. 取消旧的计时器(如果存在) if (countDownTimer != null) { countDownTimer.cancel(); } // 4. 生成新的题目 ispisivanjeDugmeta(); // 5. 启动新计时器并调整UI状态 startovanjeTajmera(); linearLayout.setVisibility(View.INVISIBLE); startDugme.setVisibility(View.INVISIBLE); // 和第一次启动保持一致 }
优化startovanjeTajmera()方法(可选但推荐)
为了避免重复代码,确保每次启动计时器前都取消旧实例,可以把取消逻辑移到这里:
private void startovanjeTajmera() { // 先取消旧计时器 if (countDownTimer != null) { countDownTimer.cancel(); } countDownTimer = new CountDownTimer(preostaloVreme, 1000) { @Override public void onTick(long millisUntilFinished) { preostaloVreme = millisUntilFinished; updateTajmer(); } @Override public void onFinish() { linearLayout.setVisibility(View.VISIBLE); rezultat.setText(brojPogodnjenihOdgovora + " / " + brojPokusaja); startDugme.setVisibility(View.VISIBLE); // 这里改成显示开始按钮,方便用户手动触发 } }.start(); }
额外注意点
- 你原来在
onFinish()里调用了startDugme(findViewById(R.id.start_dugme));,这会直接触发计时器重启,不符合逻辑,建议改成显示开始按钮,让用户手动点击启动。 - 确保所有UI操作都在主线程执行(你的代码已经满足,因为CountDownTimer的回调默认在主线程)。
这样修改后,点击重玩按钮时,计时器会重新从30秒开始倒计时,同时生成新的题目,分数也会重置,完美解决你的问题!
内容的提问来源于stack exchange,提问作者gojic
相关产品推荐
相关产品推荐

