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
更多关于HarmonyOS鸿蒙Next中如何解决ThreadWorker传参报错的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,ThreadWorker传参报错
ThreadWorker传参报错可能是由于参数类型不匹配或参数传递方式不正确导致的。确保在创建ThreadWorker实例时,传递的参数类型与ThreadWorker构造函数中定义的参数类型一致。
如果参数是复杂对象,确保该对象实现了序列化接口,以便在跨线程传递时能够正确序列化。
此外,检查ThreadWorker的onTaskProcessing
方法中是否正确处理了传入的参数。确保在调用ThreadWorker的postTask
方法时,传递的参数与onTaskProcessing
方法中定义的参数类型一致。
如果问题仍未解决,可以检查日志输出,查看是否有更详细的错误信息,以便进一步排查问题。