前提:基于官网3.1/4.0文档。参考官网文档
基于Android开发体系来进行比较和思考。(或有偏颇,自行斟酌)
一、概念
HarmonyOS应用中每个进程都会有一个主线程,主线程有如下职责:
- 执行UI绘制; 管理主线程的ArkTS引擎实例,使多个UIAbility组件能够运行在其之上;
- 管理其他线程(例如Worker线程)的ArkTS引擎实例,例如启动和终止其他线程; 分发交互事件;
- 处理应用代码的回调,包括事件处理和生命周期管理; 接收Worker线程发送的消息;
- 除主线程外,还有一类与主线程并行的独立线程Worker,主要用于执行耗时操作,但不可以直接操作UI。Worker线程在主线程中创建,与主线程相互独立。最多可以创建8个Worker
主线程即UI 线程,通过Emitter进行线程间通信(类似Handler),用于主线程内及和Worker线程的事件同步。
Worker线程即工作线程,执行耗时任务。(这里明确指出来是用于耗时任务,实际上Android中新开线程可用于cpu计算、耗时等任务。不确定是否可以同样使用)
1.主线程
使用Emitter进行线程间通信
1.订阅
import emitter from "@ohos.events.emitter";
// 定义一个eventId为1的事件
let event = {
eventId: 1
};
// 收到eventId为1的事件后执行该回调
let callback = (eventData) => {
console.info('event callback');
};
// 订阅eventId为1的事件
emitter.on(event, callback);
2.发送
import emitter from "@ohos.events.emitter";
// 定义一个eventId为1的事件,事件优先级为Low
let event = {
eventId: 1,
priority: emitter.EventPriority.LOW
};
let eventData = {
data: {
"content": "c",
"id": 1,
"isEmpty": false,
}
};
// 发送eventId为1的事件,事件内容为eventData
emitter.emit(event, eventData);
eventId相当于msgId,用来区分消息。
事件优先级的说明是怎样的?
2.Worker线程
Worker是与主线程并行的独立线程。创建Worker的线程被称为宿主线程,Worker工作的线程被称为Worker线程。创建Worker时传入的脚本文件在Worker线程中执行,通常在Worker线程中处理耗时的操作,需要注意的是,Worker中不能直接更新Page。
如果宿主是UI 线程,那么该Worker线程是不是UI 线程?
1.配置
在工程的模块级build-profile.json5文件的buildOption属性中添加配置信息。
"buildOption": {
"sourceOption": {
"workers": [
"./src/main/ets/workers/worker.ts"
]
}
}
2.订阅及发送
import worker from '@ohos.worker';
let wk = new worker.ThreadWorker("entry/ets/workers/worker.ts");
// 发送消息到worker线程
wk.postMessage("message from main thread.")
// 处理来自worker线程的消息
wk.onmessage = function(message) {
console.info("message from worker: " + message)
// 根据业务按需停止worker线程
wk.terminate()
}
相较于UI线程,多了配置的一步。(猜测是为了减少包大小?但是这么重要的包,理论上应该要集成进SDK的,而不是依靠配置来引入。可能有其他原因。总体而言,多了一步就复杂了一些。)