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

如何在CountDownTimer运行时自动累加数值?解决应用崩溃问题

问题分析

你的代码崩溃主要有两个原因:

  1. 点击按钮后立刻执行Integer.parseInt(milltime.getText().toString()),但此时第二个倒计时器的onTick还没触发,milltime的初始文本大概率不是合法整数,直接解析会抛出NumberFormatException导致崩溃。
  2. 计算amount的代码只在按钮点击时执行一次,不会随着倒计时推进持续更新,根本实现不了“数值持续增加”的需求。

另外,1ms间隔的倒计时器过于频繁,会严重占用UI线程资源,建议调整为合理间隔(比如100ms或1000ms)。

修正后的代码
public class Main extends AppCompatActivity {
    TextView Time;
    ImageButton button;
    TextView amount;
    TextView rate, milltime;
    // 用变量存储累计值,避免每次依赖UI文本读取
    private int totalAmount = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Time = findViewById(R.id.Time);
        button = findViewById(R.id.button);
        amount = findViewById(R.id.Amount);
        rate = findViewById(R.id.Ratenumber);
        milltime = findViewById(R.id.milltime);

        // 初始化默认值,避免解析空文本崩溃
        milltime.setText("10000");
        rate.setText("1");
        amount.setText("0");

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                totalAmount = 0; // 点击开始时重置累计值

                // 合并两个倒计时器,减少UI线程负担
                new CountDownTimer(10000, 100) { // 调整为100ms间隔,平衡流畅度与性能
                    @Override
                    public void onTick(long millisUntilFinished) {
                        // 更新时分秒显示
                        NumberFormat f = new DecimalFormat("00");
                        long hour = (millisUntilFinished / 3600000) % 24;
                        long min = (millisUntilFinished / 60000) % 60;
                        long sec = (millisUntilFinished / 1000) % 60;
                        Time.setText(f.format(hour) + ":" + f.format(min) + ":" + f.format(sec));

                        // 更新毫秒相关显示
                        String millText = millisUntilFinished / 1000 + "" + millisUntilFinished % 1000;
                        milltime.setText(millText);

                        // 计算并更新累计值
                        try {
                            int rateValue = Integer.parseInt(rate.getText().toString());
                            // 按需求每tick累加速率值,若要使用原公式可替换此处逻辑
                            totalAmount += rateValue;
                            amount.setText(String.valueOf(totalAmount));
                        } catch (NumberFormatException e) {
                            // 处理速率不是合法整数的情况
                            amount.setText("无效速率");
                        }
                    }

                    @Override
                    public void onFinish() {
                        Time.setText("Click to start");
                        milltime.setText("Did it work?");
                    }
                }.start();
            }
        });
    }
}
关键修改点
  • 把amount的计算与更新逻辑移到倒计时器的onTick方法内,保证每次倒计时触发时都会刷新数值。
  • 增加异常捕获,避免rate文本不是合法整数时崩溃。
  • 初始化控件默认值,解决初始状态下解析空文本的问题。
  • 合并两个倒计时器,调整间隔为100ms,减少UI线程资源占用。
  • 用totalAmount变量存储累计值,避免频繁读取UI文本,提升效率与可靠性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:09:48