You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:如何在每次启动CountDownTimer前重置并传入新值?

解决CountDownTimer多实例同时运行的问题

嘿,我明白你遇到的麻烦了——点击不同时长的按钮时,TextView会同时显示多个计时数值,这是因为旧的CountDownTimer实例没有被正确终止,甚至第一次点击按钮时还会因为countDownTimer初始为null调用cancel()而触发空指针异常!

问题根源

  1. 初始化时countDownTimer是null,第一次点击按钮调用countDownTimer.cancel()会直接崩溃。
  2. 即使后续点击,若没有正确终止旧的计时器,新创建的计时器会和旧的同时更新同一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:29:08