Android开发:如何在每次启动CountDownTimer前重置并传入新值?
解决CountDownTimer多实例同时运行的问题
嘿,我明白你遇到的麻烦了——点击不同时长的按钮时,TextView会同时显示多个计时数值,这是因为旧的CountDownTimer实例没有被正确终止,甚至第一次点击按钮时还会因为countDownTimer初始为null调用cancel()而触发空指针异常!
问题根源
- 初始化时
countDownTimer是null,第一次点击按钮调用countDownTimer.cancel()会直接崩溃。 - 即使后续点击,若没有正确终止旧的计时器,新创建的计时器会和旧的同时更新同一个
TextView,导致显示混乱。
修复方案
我们需要在创建新计时器前,先检查旧计时器是否存在且正在运行,安全地取消它,再初始化新的实例。修改后的代码如下:
package com.rebootapp.myapplication; import android.os.CountDownTimer; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; public class MainActivity extends AppCompatActivity { TextView textView; CountDownTimer countDownTimer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.timer); } public void runtimer(View view) { // 先取消正在运行的计时器(如果存在) if (countDownTimer != null) { countDownTimer.cancel(); } switch (view.getId()) { case R.id.min3: timer(10000); break; case R.id.min5: timer(20000); break; case R.id.min10: timer(30000); break; default: textView.setText(""); // 清空计时器引用 countDownTimer = null; break; } } public void timer(int t){ // 创建新的计时器并启动 countDownTimer = new CountDownTimer(t, 1000) { @Override public void onTick(long millisUntilFinished) { textView.setText("" + millisUntilFinished / 1000); } @Override public void onFinish() { textView.setText("计时结束"); // 计时结束后清空引用,避免后续误操作 countDownTimer = null; } }.start(); } }
关键修改点
- 安全取消旧计时器:在
runtimer()方法开头添加if (countDownTimer != null)判断,避免空指针异常,确保旧计时器被终止。 - 计时结束后清空引用:在
onFinish()里把countDownTimer设为null,保证下次操作时状态干净。 - 统一取消逻辑:把取消操作移到switch外面,避免重复代码,确保每次点击按钮都会先终止旧计时器。
这样修改后,每次点击不同按钮时,旧的计时器会被立刻终止,只有新的计时器在更新TextView,就不会出现多个计时数值同时显示的问题啦!
内容的提问来源于stack exchange,提问作者Rajat Srivastav
相关产品推荐
相关产品推荐

