You need to enable JavaScript to run this app. 安卓拳击倒计时器:如何在全部流程结束后正确显示结束提示
优惠活动
大模型
产品
解决方案
定价
更多

安卓拳击倒计时器:如何在全部流程结束后正确显示结束提示

问题根因
  • 原有判断逻辑把UI展示层的文本作为业务判断锚点,存在天然的时序偏差:判断触发的时机刚好卡在每段训练结束、还未给tv1设置“Przerwa”文本的间隙,此时tv1仍显示“Runda”,条件!tv1.getText().toString().equals("Przerwa")直接成立,导致每一轮训练结束切休息前都会误弹出“end”提示。
  • 没有绑定全流程的唯一终态判断标准,将单段计时的结束事件错误等同于整个训练流程的结束事件。
修正实现方案

完全不需要依托TextView的文本内容做判断,直接基于已有的回合配置、进度计数器实现可靠的终态判断:

  1. 在计时逻辑的全局作用域(Activity/Fragment的成员变量区)初始化两个核心值,避免反复读控件文本做类型转换的额外开销:
    • 读取tv4存储的总训练回合配置值,转为整数totalRound作为全流程的总目标值
    • 定义整数计数器finishedRound,记录已经走完的完整训练回合数,初始值为0
  2. 拆分各个计时节点的触发分支:
    • 当单段训练类的CountDownTimer走完时,先对finishedRound做累加操作
    • 对比累加后的已完成回合数和总配置值:
      • 若两者数值相等,直接进入全流程终态:执行tv3.setText("end"),同时取消所有未执行的Handler延迟任务、销毁尚未触发的CountDownTimer,不再启动后续的休息计时流程
      • 若已完成数小于总配置数,才正常切换为休息界面:给tv1设置“Przerwa”文本、更新tv2的回合进度值、启动休息阶段的CountDownTimer
  3. 核心判断逻辑参考代码:
// 写在单段训练计时CountDownTimer的onFinish()回调内
finishedRound++;
// 命中最终结束条件
if (finishedRound == totalRound) {
    tv3.setText("end");
    // 清理所有未执行的定时任务,避免内存泄漏
    currentTrainTimer.cancel();
    handler.removeCallbacksAndMessages(null);
    return;
}
// 未达到总回合数,正常进入休息环节
tv1.setText("Przerwa");
startRestRoundCountDown();
注意事项
  • 禁止将TextView的展示文本作为业务逻辑的判断依据:后续如果修改状态文案、新增其他界面状态(比如开场准备、收尾提示),原有的文本匹配逻辑会直接失效,误判风险极高。
  • 全流程结束分支必须做定时任务清理,避免Activity销毁后Handler仍持有组件引用、计时在后台持续运行的内存泄漏问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 02:54:05