HarmonyOS鸿蒙Next中如何将耗时耗性能的操作从主线程优化到子线程执行?
HarmonyOS鸿蒙Next中如何将耗时耗性能的操作从主线程优化到子线程执行?
耗时操作主要是信令请求,当前的信令请求现状: 有req class,rsp class类,请求时new 一个req class的模型类对象,然后把req class转成arraybuffer,通过websocket传递给服务器,websocket接收到回包后,需要把arraybuffer转换成rsp class,即: req class->arraybuffer -> arraybuffer -> rsp class 这里面req class->arraybuffer和arraybuffer -> rsp class都是比较耗时耗性能的操作,对象大时耗时能达到几百毫秒,目前都是在主线程中执行的,性能比较差。
一、希望优化到子线程中执行,请问这个怎样优化比较好?
二、数据怎么传输?如果在子线程完成了arraybuffer->rsp class,那么这个模型对象怎么传回主线程?
更多关于HarmonyOS鸿蒙Next中如何将耗时耗性能的操作从主线程优化到子线程执行?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
可查看以下文档:
其他说明:
- 多线程方案:有TaskPool方案和Worker方案。在一个App之中Worker有数量的限制,如果是一个大型App的话,轻型多线程任务的话,建议采用TaskPool方案。
- 跨线程数据传递:
- emitter方案:如果数据量小的话,可尝试采用emitter方案进行跨线程方案,数据也可以通过emitter进行传递;
- sendable方案:如果数据量大的话,多线程需要同步访问的时候,可采用sendable方案。但是共享数据在多线程之间访问的时候,需要考虑并发安全的问题。
更多关于HarmonyOS鸿蒙Next中如何将耗时耗性能的操作从主线程优化到子线程执行?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
一、考虑到子线程操作,目前ts侧处理主要有两种方式: TaskPool:主要用于3分钟内的耗时任务,适用高并发; Worker:对于耗时任务没有时间限制,利用消息机制做到主动和主线程交互。
TaskPool和worker介绍:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/multi-thread-concurrency-overview-V5
官方的使用TaskPool和Worker的参考demo:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/interthead-communication-guide-V13
二、针对数据传输
-
可以考虑使用@Sendable装饰器去修饰,这个是主线程和子线程同时共享的, https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-sendable-V5
-
使用TaskPool发送数据 :SendData和onReceiveData,用于从子线程向主线程发送数据,参考链接: https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-taskpool#senddata11
-
使用Worker进行数据传递:postMessage,参考链接: https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-worker#postmessage9
目前主线程与其他线程存在大量数据交互时,建议使用@Sendable装饰器来优化,数据传递转换可以按需来传递。 https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-time-optimization-of-the-main-thread#section32971936174416
在HarmonyOS鸿蒙Next中,可以通过使用TaskDispatcher
将耗时操作从主线程优化到子线程执行。首先,获取TaskDispatcher
实例,如globalTaskDispatcher
或parallelTaskDispatcher
。然后,使用asyncDispatch
或delayDispatch
方法将任务分发到子线程。例如:
let globalTaskDispatcher = taskpool.getGlobalTaskDispatcher();
globalTaskDispatcher.asyncDispatch(() => {
// 耗时操作
});
这样可以避免阻塞主线程,提升应用性能。
在HarmonyOS Next中优化耗时操作到子线程的建议:
- 使用Worker线程处理耗时转换:
- 创建Worker线程处理序列化/反序列化操作
- 主线程通过postMessage()发送请求数据到Worker
- Worker完成转换后通过postMessage()返回结果
- 数据传输方案:
- 使用ArrayBuffer作为线程间数据传输格式(高效且可共享)
- 对于复杂对象,建议: a) 在Worker中完成arraybuffer→rsp转换后,通过序列化方式传回主线程 b) 或仅传回必要字段数据而非整个对象
- 具体实现示例:
// 主线程
const worker = new Worker('workers/SerializerWorker.js');
worker.postMessage({cmd: 'serialize', data: reqObj});
worker.onmessage = (event) => {
const {cmd, data} = event.data;
if(cmd === 'serialized') {
// 发送arraybuffer到websocket
} else if(cmd === 'deserialized') {
// 获取反序列化后的rsp对象
}
};
- 注意事项:
- 线程间通信数据需要可序列化
- 避免频繁线程切换带来的性能开销
- 大对象建议分块处理
这种方案能有效保持UI流畅,同时处理耗时操作。