首页/新闻资讯/正文详情

《HarmonyOS 7 精准碰一碰跨设备协作开发实战》07:异常恢复、状态机与CrossDrop工程收尾【鸿蒙心迹】

发布时间:2026/9/27 3:35:32 来源:云帆数科 栏目:资讯中心
《HarmonyOS 7 精准碰一碰跨设备协作开发实战》07:异常恢复、状态机与CrossDrop工程收尾【鸿蒙心迹】
前六篇我们一路做下来功能都有了。但真用起来呢传到一半App退了怎么办窗口关了怎么办URI失效了怎么办这一篇把这些问题收口。写到这里CrossDrop已经有了精准分享、触点识别、区域路由、多窗口、多文件、业务指令、多设备并发。看起来挺完整。但我自己测的时候发现一堆问题传到一半用户直接把App划掉了。窗口关了任务还在后台跑。文件URI过期了打开失败。用户碰了两次同一个任务传了两遍。切到后台再回来之前的任务状态全丢了。这些问题不解决Demo就是Demo真用起来全是bug。这一篇做工程收口。一、TransferStateMachine统一状态机前面我们零散地定义了一些状态。这一篇统一起来。一个任务从开始到结束要经历这些状态IDLE → RECEIVED → VALIDATING → PROCESSING → COMPLETED中间任何一步失败都可能进入FAILED → RETRYING用户取消进入CANCELLED关键是状态迁移要合法。不能从COMPLETED再跳回PROCESSING不能从IDLE直接跳到COMPLETED。这段代码解决什么问题任务状态机。文件state/TransferStateMachine.ets用途统一管理任务状态迁移接入位置每个TransferTask持有enumTransferState{IDLEidle,RECEIVEDreceived,// 已接收VALIDATINGvalidating,// 校验中PROCESSINGprocessing,// 处理中COMPLETEDcompleted,// 完成FAILEDfailed,// 失败RETRYINGretrying,// 重试中CANCELLEDcancelled// 已取消}classTransferStateMachine{privatestate:TransferStateTransferState.IDLE;// 合法状态迁移表privatevalidTransitions:RecordTransferState,TransferState[]{[TransferState.IDLE]:[TransferState.RECEIVED,TransferState.CANCELLED],[TransferState.RECEIVED]:[TransferState.VALIDATING,TransferState.CANCELLED],[TransferState.VALIDATING]:[TransferState.PROCESSING,TransferState.FAILED,TransferState.CANCELLED],[TransferState.PROCESSING]:[TransferState.COMPLETED,TransferState.FAILED,TransferState.CANCELLED],[TransferState.FAILED]:[TransferState.RETRYING,TransferState.CANCELLED],[TransferState.RETRYING]:[TransferState.VALIDATING,TransferState.CANCELLED],[TransferState.COMPLETED]:[],[TransferState.CANCELLED]:[]};canTransitionTo(newState:TransferState):boolean{returnthis.validTransitions[this.state].includes(newState);}transitionTo(newState:TransferState):boolean{if(this.canTransitionTo(newState)){this.statenewState;returntrue;}console.warn(非法状态迁移this.state → newState);returnfalse;}getState():TransferState{returnthis.state;}}二、任务持久化App退了也能恢复最大的问题是App退了任务状态全丢了。解决办法把任务状态持久化到本地。每次状态变化都存到RDB或Preferences里。App重新启动时读出来恢复未完成的任务。这段代码解决什么问题任务持久化。文件persist/TaskRepository.ets用途任务状态本地持久化接入位置任务状态变化时调用classTaskRepository{// 保存任务状态asyncsaveTask(task:TransferTask){letstoreawaitrelationalStore.getRdbStore(...);awaitstore.executeSql(INSERT OR REPLACE INTO tasks (id, uri, state, progress, retry_count) VALUES (?, ?, ?, ?, ?),[task.id,task.uri,task.stateMachine.getState(),task.progress,task.retryCount]);}// 加载所有未完成任务asyncloadPendingTasks():PromiseTransferTask[]{letstoreawaitrelationalStore.getRdbStore(...);letresultawaitstore.querySql(SELECT * FROM tasks WHERE state NOT IN (completed, cancelled));lettasks:TransferTask[][];while(result.goToNextRow()){lettasknewTransferTask(result.getString(0),result.getString(1));task.progressresult.getDouble(3);task.retryCountresult.getLong(4);tasks.push(task);}returntasks;}// App重启后恢复asyncrestoreOnStartup(){letpendingawaitthis.loadPendingTasks();console.info(恢复未完成任务pending.length个);for(lettaskofpending){// 重新加入队列继续处理taskQueue.addTask(task);}}}三、资源释放该清的都清掉最后一个问题资源泄漏。Listener没注销、Session没关闭、Buffer没释放——这些都会慢慢耗内存。App退出、窗口关闭、任务完成时都要清理注销所有状态监听关闭所有DeviceSession释放未使用的Buffer取消还在跑的异步任务四、整个连载回顾七篇下来我们做了一条完整链路01能传——搭好CrossDrop工程骨架实现第一条完整链路。02知道碰哪里——屏幕坐标到应用坐标的转换。03知道碰哪个窗口——多窗口识别与路由。04能传很多——多文件任务队列并发控制。05能传业务指令——传输层和业务层解耦。06能同时传多设备——每台设备独立Session。07能稳定运行——状态机、持久化、资源释放。从碰一下传文件到碰哪传哪、多窗口、多文件、多设备、稳定可靠这就是完整的跨设备协作工作台。最终总结做跨设备分享看起来就是传个文件这么简单。真做下来从坐标转换、窗口识别、任务队列、业务协议、多设备并发到最后状态机和持久化每一层都有工程问题。这也是做系统级能力的乐趣不是调个API就完了而是要把传输、路由、状态、资源整个链路想清楚。

相关推荐

《电路分析基础》全套PPT课件2026
《电路分析基础》全套PPT课件2026

《电路分析基础》全套PPT课件2026 课件内容: 第1章电路的基本概念与定律.ppx 第2章电阻电路的一般分析法.pptx 第3章电路的基本定理.pptx 第4章一阶动态电路的时域分析.pptx 第5章正弦稳态电路分析.pptx 第6章耦合电感与理想变压器电路分析.ppx 第7章三相电路.pptx … · 2026/9/27 3:35:26

用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)

(本文使用 AI 辅助创作) VirtualBox 是一个好用且开源的跨平台 虚拟机 软件, 支持在 GNU/Linux, Windows 等操作系统上运行虚拟机, 并且有方便操作的界面. 类似的虚拟化软件比如 QEMU/KVM 只支持在 Linux 上运行, 而 VirtualBox 还支持 Windows, 这是一个明显的优点. 本文给… · 2026/9/27 3:35:25

万网怎么更改网站名字的实战指南新手入门必看
万网怎么更改网站名字的实战指南新手入门必看

万网怎么更改网站名字的实战指南新手入门必看 模板网站太丑不够用,这是很多刚接触建站的朋友第一反应。想换个名字、改个域名,却发现后台操作比想象中复杂。其实,万网怎么更改网站名字的这个问题,核心不在于“改名”,而在于域名绑定、DNS解析和服务器… · 2026/9/27 3:35:19

网站代建设费用吗?5年实战避坑指南与源码解析
网站代建设费用吗?5年实战避坑指南与源码解析

网站代建设费用吗?5年实战避坑指南与源码解析 别再被那些花里胡哨的模板网站忽悠了。很多老板花了几千块,拿回来一个套壳站,打开慢、样式丑,改个颜色还得求供应商,这钱花得冤不冤?我干了十年建站,见过太多这种“电子废品”。今天这篇 避坑指南… · 2026/9/27 4:16:42

位移传感器没信号?先别拆,万用表五步定位法
位移传感器没信号?先别拆,万用表五步定位法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 4:16:36

嵌入式硬件调试五法:串口打印、逻辑分析仪、JTAG/SWD等实战决策指南
嵌入式硬件调试五法:串口打印、逻辑分析仪、JTAG/SWD等实战决策指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 4:16:36

SpringBoot+微信小程序图书管理系统实战:登录、借阅与部署全解析
SpringBoot+微信小程序图书管理系统实战:登录、借阅与部署全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 4:16:36

Docker多阶段构建实战:让Nginx镜像从400MB瘦身到200MB,体积砍半!
Docker多阶段构建实战:让Nginx镜像从400MB瘦身到200MB,体积砍半!

一、实验背景 在上一节实验中,我们基于 CentOS 7 构建了 YUM 版 Nginx 镜像,但镜像体积高达 400MB。这是因为 CentOS 7 基础镜像本身就包含大量系统工具和库,而容器运行 Nginx 实际上并不需要完整的操作系统环境。 多阶段构建(Mul… · 2026/9/27 4:16:30

搞懂怎么给网站做超链接,源码下载避坑指南
搞懂怎么给网站做超链接,源码下载避坑指南

搞懂怎么给网站做超链接,源码下载避坑指南 备案流程一头雾水?很多新手刚拿到服务器,盯着后台那些ICP备案号、域名解析记录,脑子直接宕机。别慌,先别管备案那些繁琐的表格和审核周期,咱们先把手头最基础的活干完。如果你是从 源码下载… · 2026/9/27 4:16:30

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码