循环累加异常求助:value3加5十次仅生效一次及Android代码修复
嘿,我来帮你分析下这段代码的问题,然后给你搞定它!
首先看你代码里的两个核心坑:
- 外层那个
for(j=0;j<10;j++)完全是多余的!你循环10次给rel设置点击监听,结果就是最后一次的监听会把前面9次的都覆盖掉,相当于白做了9次操作,完全没用。 - 点击事件里的内层循环更关键:你每次都是从
value里取原始值转成value2,然后加5赋值给value3——这相当于每次都是原始值+5,而不是在上一次累加后的value3基础上再加5。比如原始值是10,循环10次后value3还是15,因为每次都是10+5,根本没实现累加!而且就算你改对了累加逻辑,这个循环执行得太快,UI线程会等循环跑完才更新界面,你也只能看到最后一次的结果,中间的变化根本看不到。
接下来给你两种解决方案,看你要哪种效果:
方案1:点击一次直接累加50(10次加5的总和)
这种是最直接的,不需要循环,直接计算总增量,适合不需要看中间过程的场景:
// 只需要给rel设置一次点击监听,别搞外层循环了! rel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (rel == null) return; // 提前判断,减少嵌套 try { // 先获取当前的数值(假设value是显示当前值的TextView) double currentValue = Double.parseDouble(value.getText().toString()); // 直接加5*10=50 currentValue += 5.0 * 10; value3 = currentValue; // 保存到你的成员变量里 balance.setText(String.valueOf(value3)); // 更新UI } catch (NumberFormatException e) { // 防止value里的内容不是合法数字导致崩溃 balance.setText("无效数字"); } } });
方案2:点击后逐步累加5,每步都能看到UI更新(带延迟)
如果你想看到每次加5的过程(比如每隔半秒加一次,共加10次),那不能直接用for循环,得用Handler来延迟执行,不然UI不会实时更新:
rel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (rel == null) return; try { double currentValue = Double.parseDouble(value.getText().toString()); final double[] tempValue = {currentValue}; // 用数组让内部类能修改这个值 Handler handler = new Handler(Looper.getMainLooper()); Runnable addRunnable = new Runnable() { int count = 0; // 记录已经累加的次数 @Override public void run() { if (count < 10) { tempValue[0] += 5.0; balance.setText(String.valueOf(tempValue[0])); count++; // 每隔500毫秒执行一次,你可以修改这个时间间隔 handler.postDelayed(this, 500); } else { // 10次累加完成后,把最终值存到value3 value3 = tempValue[0]; } } }; // 启动第一次累加 handler.post(addRunnable); } catch (NumberFormatException e) { balance.setText("无效数字"); } } });
最后再提两个注意点:
- 确保
value3是你的Activity/Fragment的成员变量,不然每次点击都会重新初始化,存不住累加后的值。 - 处理
NumberFormatException很重要,万一value里的内容不是数字,你的App会崩溃,所以一定要加异常捕获。
内容的提问来源于stack exchange,提问作者Syahmilite
相关产品推荐
相关产品推荐

