如何在CountDownTimer运行时自动累加数值?解决应用崩溃问题
问题分析
你的代码崩溃主要有两个原因:
- 点击按钮后立刻执行
Integer.parseInt(milltime.getText().toString()),但此时第二个倒计时器的onTick还没触发,milltime的初始文本大概率不是合法整数,直接解析会抛出NumberFormatException导致崩溃。 - 计算
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
相关产品推荐
相关产品推荐

