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

4 回复

可查看以下文档:

  1. 应用并发设计
  2. 并发线程间通信

其他说明:

  1. 多线程方案:有TaskPool方案和Worker方案。在一个App之中Worker有数量的限制,如果是一个大型App的话,轻型多线程任务的话,建议采用TaskPool方案。
  2. 跨线程数据传递:
  • 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

二、针对数据传输

  1. 可以考虑使用@Sendable装饰器去修饰,这个是主线程和子线程同时共享的, https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-sendable-V5

  2. 使用TaskPool发送数据 :SendData和onReceiveData,用于从子线程向主线程发送数据,参考链接: https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-taskpool#senddata11

  3. 使用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实例,如globalTaskDispatcherparallelTaskDispatcher。然后,使用asyncDispatchdelayDispatch方法将任务分发到子线程。例如:

let globalTaskDispatcher = taskpool.getGlobalTaskDispatcher();
globalTaskDispatcher.asyncDispatch(() => {
    // 耗时操作
});

这样可以避免阻塞主线程,提升应用性能。

在HarmonyOS Next中优化耗时操作到子线程的建议:

  1. 使用Worker线程处理耗时转换:
  • 创建Worker线程处理序列化/反序列化操作
  • 主线程通过postMessage()发送请求数据到Worker
  • Worker完成转换后通过postMessage()返回结果
  1. 数据传输方案:
  • 使用ArrayBuffer作为线程间数据传输格式(高效且可共享)
  • 对于复杂对象,建议: a) 在Worker中完成arraybuffer→rsp转换后,通过序列化方式传回主线程 b) 或仅传回必要字段数据而非整个对象
  1. 具体实现示例:
// 主线程
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对象
  }
};
  1. 注意事项:
  • 线程间通信数据需要可序列化
  • 避免频繁线程切换带来的性能开销
  • 大对象建议分块处理

这种方案能有效保持UI流畅,同时处理耗时操作。

回到顶部