本系列第 4/8 课,建议 45–60 分钟(估算)。先完成上一课。
这课解决什么
任务有待开始、运行、暂停、完成四个状态。每个按钮只能执行状态允许的转换。暂停保存剩余并停止刷新;继续从此刻建立新的截止时间,因此暂停期间不扣时。
先预测,再运行
暂停 20 秒,再继续时,原先 108 秒会变成 88 秒吗?
先记下自己的答案,运行起始工程与完成工程比较;答案见文末。
开始实战
以上一课完成工程为起点,先导入并运行,再另存为本课作业。
完成工程可以查看答案;独立作业请保留自己的修改。
新增或调整的组件
| 实例名 | 组件 | 本课配置 |
|---|---|---|
标签_标题 |
标签 | Width=Fill parent;FontSize=24;TextColor=#183153;Text=专注学习 · 第 4课 |
按钮_暂停 |
按钮 | Width=Fill parent;BackgroundColor=#2563EB;TextColor=#FFFFFF;FontSize=16;Text=暂停 / 继续 |
逐步搭建
- 声明状态变量;开始入口只允许待开始或完成,防止运行中重置截止。
- 运行且尚未到期时,暂停保存剩余并关 Timer;到期边缘让 Timer 完成,不进入剩余为零的暂停死状态。
- 暂停且剩余>0 时允许继续,重新计算截止,重新启用计时器。
- 开始→重复开始→暂停→等待→继续→完成;画出每一步的状态和截止变化。

图来自本课最终工程执行积木后的状态,为 HTML 近似预览;不是手机截图。
核心积木与数据流
下面是本课完成工程中的核心代码,包含所需全局变量和过程。可在块图中追踪数值,再回到工程对照完整事件;合并到已有工程时,同名事件合并处理。
global 剩余 = 0
global 截止 = 0
global 状态 = "待开始"
global 任务 = ""
when 按钮_暂停.Click() {
if 状态 = "运行" and 截止 > 计时器1.SystemTime() {
剩余 = max(0, ceil((截止 - 计时器1.SystemTime()) / 1000))
状态 = "暂停"
计时器1.TimerEnabled = false
} else if 状态 = "暂停" and 剩余 > 0 {
截止 = 计时器1.SystemTime() + 剩余 * 1000
状态 = "运行"
计时器1.TimerEnabled = true
}
标签_状态.Text = join(状态, ":", 任务)
}
中途检查与排错
本课以下控制与数据流已执行最终归档中的真实积木检查。请在伴侣或安装的 APK 中按相同场景操作,记录实际结果;自动检查通过不代表手机已实测。
- 拒绝空任务。
- 非数字、非正数、上限、小数拒绝。
- 2分钟等于120秒。
- 延迟回调按实际时间计算。
- 运行中重复开始不重置。
- 暂停期间不扣时。
- 到期与重复计时回调。
排查时先确定出错的是输入、状态、数据读取还是显示;用标签暂时显示关键值,每次只改变一个条件。
本阶段尚未加入数据保存,关闭应用会丢失任务;计时器用于前台刷新,不是系统后台闹钟。
两个理解题与独立改造
- 暂停 20 秒,再继续时,原先 108 秒会变成 88 秒吗?
- 业务状态为什么不能只通过按钮显示的文字判断?
独立改造: 增加取消,明确取消是否记为完成。
先完成自己的工程,再对照答案。检查成功路径,也检查空数据、重复操作和取消;写出你改动的规则。
查看预测与练习参考答案
预测: 不会。暂停期间不扣时;继续时截止=现在+108000 毫秒。
追踪: 显示会本地化或改文案,业务状态应使用独立变量及明确转换。
改造思路: 取消把状态设待开始、剩余置零、关闭计时器;不增加完成数。状态和业务统计应分别处理。
完成与下一步
保存自己的工程并导出 .aia;给文件命名以区分本课作业和参考源码。请用自己的话解释本课知识,并展示一次失败输入的处理。
扫码添加客服咨询