Parallel Vision 超分辨率取消后旧图又覆盖回来:HarmonyOS 7 任务代际和回调提交怎么守
用户选择图片 A 开始超分辨率,马上又换成图片 B。A 的任务虽然取消,稍后回调仍然到达,把 B 的预览覆盖成 A。AI 图像任务通常跨线程、耗时且有中间结果,取消请求不等于所有回调瞬间消失。页面必须只接受当前一代任务的提交。
验证范围:官方页面用于确认 HarmonyOS 7/API 26 的能力方向;文章代码只验证应用侧状态、预算或一致性模型。当前电脑是 API 24 SDK,且没有连接 HarmonyOS 7 真机,所以下面的断言不是 API 26 编译、设备性能或线上效果证明。
用 A-B 快速切换重现覆盖
让 A 任务固定延迟 2 秒,B 任务延迟 500ms;选择 A 后 100ms 切到 B。即使调用取消,也保留 A 的迟到回调用于测试。最终页面必须显示 B,缓存也不能把 A 写入 B 的 key。
案例一:预览切换只提交最新代际
中间预览可以多次到达,但每次都核对 generation 和 sourceId。旧代际结果直接释放资源,不触发 UI。
案例二:批量增强允许每项独立完成
批量任务不能用一个全局 generation 把其他图片一起取消。每个 itemId 有自己的代际和终态,页面汇总逐项状态。
取消和提交是两个独立动作
取消是一条控制消息,执行器可能已经进入不可中断阶段;回调队列也可能已有结果。只在按钮上设置 loading=false,挡不住旧回调提交。
classGenerationGate{privatecurrent=0;start(){return++this.current;}accept(g:number){returng===this.current;}}constgate=newGenerationGate();consta=gate.start();constb=gate.start();if(gate.accept(a))thrownewError('旧图回调被接受');if(!gate.accept(b))thrownewError('当前图结果被拒绝');这段模型用确定输入验证“只有当前图像任务代际能提交预览和最终结果”。它适合先发现边界错误,但不会冒充平台接口或设备性能测试。
结果处理有三种选择
| 方案 | 适用范围 | 主要风险 |
|---|---|---|
| 只调用 cancel | 执行器保证强取消 | 迟到回调仍可能覆盖 |
| 页面保存当前文件名 | 文件名全局唯一 | 同名文件和编辑版本冲突 |
| 任务代际加 sourceId | 交互式图像处理 | 需要释放旧结果资源 |
使用任务代际和 sourceId 双重校验;取消用于节省资源,提交门禁用于保证正确性。二者不能相互替代。
建立任务代际控制器
封装LatestImageJob,负责 start/cancel/progress/complete,并在拒绝旧回调时释放像素缓冲。OCR、抠图和风格迁移也可复用。
图像链路的证据怎么留
- A-B 快速切换最终只显示 B。
- 取消后的迟到回调被记录但不提交。
- 中间结果和终态使用同一代际。
- 旧像素缓冲及时释放。
- 批量模式按 itemId 独立控制。
AI 任务的正确性不能寄托在“取消应该来得及”。把代际门禁放在最后提交点,才真正守住用户当前选择。
官方资料
- HarmonyOS 7 新能力
- Harmony Intelligence 与视觉能力
- 2026 年 9 月开发者月刊