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

Android多CountDownTimer对象创建异常问题求助

问题根源与修复方案

嘿,我一眼就看出问题出在哪了——你所有的CountDownTimer实例都在操作同一个全局的countdown TextView,而且你还同时启动了两个计时器,它们互相抢着修改同一个UI控件的文本,结果自然就是数字乱跳了。

为啥会这样?

  1. 共用UI控件:你在onTick里更新的countdown是个全局变量,不管创建多少个计时器,它们都会往同一个TextView里写数字。两个计时器同时跑的时候,你写一个我写一个,显示的内容当然混乱。
  2. 同时启动计时器:你连续调用timer1.start()和timer2.start(),两个计时器会立刻同时开始倒计时,而不是你期望的“先跑完第一个再跑第二个”。

怎么修复?

方案1:给每个计时器分配独立的TextView

修改你的setUpCountdown方法,把TextView作为参数传进去,让每个计时器只操作自己的专属UI:

private CountDownTimer setUpCountdown(int duration, int tick, TextView countdownView) {
    // 处理默认tick值
    tick = (tick == 0 ? 1 : tick);
    return new CountDownTimer(duration*1000, tick*1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            if (countdownView != null) {
                int timeRemaining = (int) (millisUntilFinished / 1000);
                countdownView.setText(String.valueOf(timeRemaining));
            }
        }
        @Override
        public void onFinish() {
            if (countdownView != null) {
                countdownView.setVisibility(View.INVISIBLE);
                baseLayout.removeView(countdownView);
            }
            baseLayout.setBackgroundColor(Color.BLACK);
        }
    };
}

然后创建独立的TextView分别绑定计时器:

// 第一个计时器的UI
TextView countdown1 = new TextView(this);
countdown1.setTextColor(Color.WHITE);
baseLayout.addView(countdown1);
CountDownTimer timer1 = setUpCountdown(8, 1, countdown1);

// 第二个计时器的UI
TextView countdown2 = new TextView(this);
countdown2.setTextColor(Color.WHITE);
baseLayout.addView(countdown2);
CountDownTimer timer2 = setUpCountdown(5, 1, countdown2);

方案2:让计时器依次启动(先跑完第一个再跑第二个)

如果你的需求是先完成第一个倒计时,再启动第二个,那可以在第一个计时器的onFinish里触发第二个的启动(同样要注意UI的切换):

// 先创建一个共用的TextView(如果不需要同时显示两个的话)
TextView countdown = new TextView(this);
countdown.setTextColor(Color.WHITE);
baseLayout.addView(countdown);

// 创建两个计时器
CountDownTimer timer1 = new CountDownTimer(8*1000, 1000) {
    @Override
    public void onTick(long millisUntilFinished) {
        int timeRemaining = (int) (millisUntilFinished / 1000);
        countdown.setText(String.valueOf(timeRemaining));
    }
    @Override
    public void onFinish() {
        // 第一个结束后,重置UI并启动第二个
        baseLayout.setBackgroundColor(Color.BLACK);
        // 启动第二个计时器
        CountDownTimer timer2 = new CountDownTimer(5*1000, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                int timeRemaining = (int) (millisUntilFinished / 1000);
                countdown.setText(String.valueOf(timeRemaining));
            }
            @Override
            public void onFinish() {
                countdown.setVisibility(View.INVISIBLE);
                baseLayout.removeView(countdown);
                baseLayout.setBackgroundColor(Color.BLACK);
            }
        };
        timer2.start();
    }
};

timer1.start();

小提醒

记得在页面销毁(比如onDestroy)的时候调用所有计时器的cancel()方法,不然会有内存泄漏的风险哦。

内容的提问来源于stack exchange,提问作者chh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:48:03