HarmonyOS鸿蒙Next中如何解决ThreadWorker传参报错的问题

HarmonyOS鸿蒙Next中如何解决ThreadWorker传参报错的问题

【问题现象】

ThreadWorker调用postMessage时报错。

问题代码如下:

import { SocketManager } from '../SocketManager'

export class IMTask {
  cmdId: number
  needAuth: boolean
  data: Uint8Array
  seq: number

  constructor(cmdId: number, data: Uint8Array, needAuth?: boolean) {
    this.cmdId = cmdId
    this.needAuth = needAuth ?? true
    this.data = data
    this.seq = SocketManager.getInstance().getSeqNum()
  }
}

// socketManager.ets
private seqNum: number = 0
getSeqNum() {
  return this.seqNum++
}
const imWorkStage = new worker.ThreadWorker('../workers/IMWorker', { name: "im-thread" })
imWorkStage.postMessage(new IMTask(PbLoginCmdID.CID_PBLOGIN_SECRET_REQ,pubKey,false))

报错日志如下:

Pid:8525
Uid:20020040
Reason:BusinessError
Error name:BusinessError
Error message:An exception occurred during serialization, failed to serialize message.
Error code:
Stacktrace:
at init (im/src/main/ets/components/SocketManager.ets:34:9)
at anonymous (entry/src/main/ets/pages/MainPage.ets:134:37)

【背景知识】

序列化支持类型包括:除Symbol之外的基础类型、Date、String、RegExp、Array、Map、Set、Object(仅限简单对象,比如通过“{}”或者“new Object“”创建,普通对象仅支持传递属性,不支持传递其原型及方法)、ArrayBuffer、TypedArray。

特例:传递通过自定义class创建出来的object时,不会发生序列化错误,但是自定义class的属性(如Function)无法通过序列化传递。

【定位思路】

根据报错信息是序列化失败,检查序列化的类型是否是支持的类型以及序列化方式。

【解决方案】

可以将对象先转换成json字符串,再转换成Uint8Array类型。

示例代码如下:

let test = testNapi.createArrayWithLength()
let uint8Array = new Uint8Array(buffer.from(test).buffer)
// 转成Json字符串
let stringStr = JSON.stringify(new Test(1,uint8Array,true))
console.log(`stringStr: ${stringStr}`)
let textEncoder: util.TextEncoder = new util.TextEncoder();
// Json字符串转Uint8Array
let uint8array:Uint8Array = textEncoder.encodeInto(stringStr)
const byteArray = Array.from(uint8array);
console.info("数据字节数="+byteArray.length) // 序列化传输的数据量大小限制为16MB。可以转换字节数进行判断
imWorkStage.postMessage(uint8array)

更多关于HarmonyOS鸿蒙Next中如何解决ThreadWorker传参报错的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中如何解决ThreadWorker传参报错的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,ThreadWorker传参报错

ThreadWorker传参报错可能是由于参数类型不匹配或参数传递方式不正确导致的。确保在创建ThreadWorker实例时,传递的参数类型与ThreadWorker构造函数中定义的参数类型一致。

如果参数是复杂对象,确保该对象实现了序列化接口,以便在跨线程传递时能够正确序列化。

此外,检查ThreadWorker的onTaskProcessing方法中是否正确处理了传入的参数。确保在调用ThreadWorker的postTask方法时,传递的参数与onTaskProcessing方法中定义的参数类型一致。

如果问题仍未解决,可以检查日志输出,查看是否有更详细的错误信息,以便进一步排查问题。

回到顶部