HarmonyOS应用开发实战:猫猫大作战-Worker 独立线程
·


前言
Worker 是 HarmonyOS 中用于创建独立线程的解决方案。与 taskpool 的动态提交不同,Worker 是一个常驻后台线程,适合长时间运行的密集型任务。
一、Worker 创建
// main.ets — 主线程
const worker = new Worker('entry/ets/workers/GameWorker.ets');
worker.onmessage = (event) => {
console.info(`Worker 返回: ${event.data}`);
};
worker.postMessage({ type: 'compute', data: { score: 100, cats: [] } });
// GameWorker.ets — Worker 线程
import { WorkerPool, MessageEvents } from '@kit.ArkTS';
const workerPool = new WorkerPool();
workerPool.onmessage = (event) => {
const { type, data } = event.data;
if (type === 'compute') {
// 耗时计算
const result = heavyComputation(data);
workerPool.postMessage(result);
}
};
function heavyComputation(data: object): number {
// 模拟耗时的游戏计算
return 42;
}
二、Worker vs taskpool
| 特性 | Worker | taskpool |
|---|---|---|
| 生命周期 | 常驻 | 临时 |
| 创建方式 | 独立文件 | @Concurrent 函数 |
| 通信方式 | postMessage | 返回值 |
| 适用场景 | 持续运行 | 单次任务 |
| 复杂度 | 高(需要管理生命周期) | 低 |
三、游戏中的应用
// 使用 Worker 做后台自动存档
class SaveWorker {
private worker: Worker;
constructor() {
this.worker = new Worker('entry/ets/workers/SaveWorker.ets');
this.worker.onmessage = (e) => {
console.info(`保存结果: ${e.data}`);
};
}
save(score: number, cats: Cat[]): void {
this.worker.postMessage({
type: 'save',
data: { score, timestamp: Date.now() }
});
}
destroy(): void {
this.worker.terminate();
}
}
四、限制
- 独立文件:Worker 代码必须放在独立
.ets文件中 - 无法访问 UI:不能操作 DOM 或 @State
- 消息传递:通过结构化克隆传递数据
- 创建开销:Worker 创建需要 ~100ms
五、最佳实践
- 长时间任务用 Worker:持续监控、自动存档
- 单次任务用 taskpool:计算、文件 I/O
- 用完 terminate:
worker.terminate()释放资源 - 错误处理:
worker.onerror捕获异常
总结
Worker 创建常驻后台线程,适合长时间运行的任务。核心要点:独立文件创建 Worker、 postMessage/onmessage 通信、 用完后 terminate() 释放。
如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!
相关资源:
更多推荐

所有评论(0)