worker运行异常 HarmonyOS 鸿蒙Next

发布于 1周前 作者 eggper 最后一次编辑是 5天前 来自 鸿蒙OS

this.worker?.postMessage(new Transfer(‘发送消息#1’)) 这行代码运行提示异常, Error message:Obj is not a Valid object SourceCode: parent.onmessage = (message) => { ^ Stacktrace: at func_main_0 (entry/src/main/ets/TestWorker.ets:5:1) 如果注释 this.worker?.postMessage(new Transfer(‘发送消息#1’)) ,能正常运行, 请问是什么原因?怎么处理? Transfer 这个类不能序列化么?文档中说明简单对象是支持序列化的。 demo代码如下:

“buildOption”: { “sourceOption”: { “workers”: [ “./src/main/ets/TestWorker.ets” ] } },

@Entry
@Component
struct Index {
  private worker?: worker.ThreadWorker

  aboutToAppear(): void {
    this.worker = new worker.ThreadWorker('entry/ets/TestWorker.ets');
    this.worker.onmessage = (message) => {
      console.error('>>>>>>>主线程收到消息了:' + JSON.stringify(message.data))
    }
  }

  build() {
    Column() {
      Text('测试').onClick(() => {
        this.worker?.postMessage(new Transfer('发送消息#1'))
      })
    }
  }
}

TestWorker.ets 代码如下:

  import {worker} from '@kit.ArkTS';
let parent =
  worker.workerPort; // 处理来自主线程的消息 parent.onmessage = (message) => { }  export class Transfer {  constructor(text: string) {  } }


更多关于worker运行异常 HarmonyOS 鸿蒙Next的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

给你demo进行下修改,你看一下 TestWorker.ets 代码如下:

import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';

const workerPort: ThreadWorkerGlobalScope = worker.workerPort;

/**

 * Defines the event handler to be called when the worker thread receives a message sent by the host thread.

 * The event handler is executed in the worker thread.

 *

 * @param e message data

 */

workerPort.onmessage = (e: MessageEvents) => {

  // 给主线程发消息

  workerPort.postMessage('success set:' + JSON.stringify(e.data.params));

  console.log("worker set");

}

/**

 * Defines the event handler to be called when the worker receives a message that cannot be deserialized.

 * The event handler is executed in the worker thread.

 *

 * @param e message data

 */

workerPort.onmessageerror = (e: MessageEvents) => {

}

/**

 * Defines the event handler to be called when an exception occurs during worker execution.

 * The event handler is executed in the worker thread.

 *

 * @param e error message

 */

workerPort.onerror = (e: ErrorEvent) => {

}

目录结构

ets

--pages

--index.etx

--workers

--TestWorker.etx

// index.ets代码如下:

import { worker } from '@kit.ArkTS';

@Entry

@Component

struct Index {

  build() {

    Column() {

      Text('测试')

        .onClick(() => {

          WorkerHandler.postMsg(new Transfer('发送消息#1'));

        })

    }

  }

}

export class Transfer {

  text: string

  constructor(text: string) {

    this.text = text

  }

}

export class WorkerHandler {

  private static workerS = new worker.ThreadWorker("../workers/TestWorker");

  static postMsg(params: Transfer): void {

    WorkerHandler.workerS.postMessage({ 'params': params });

    // 给worker线程发消息

    WorkerHandler.workerS.onmessage = (message): void => {

      // 接收Worker子线程的结果

      console.error('>>>>>>>主线程收到消息了:' + JSON.stringify(message.data))

    }

  }

}

更多关于worker运行异常 HarmonyOS 鸿蒙Next的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对您提到的“worker运行异常 HarmonyOS 鸿蒙Next”问题,以下是一些可能的解决方案和检查点:

  1. 任务调度与资源限制:检查worker任务是否在系统资源紧张时运行,如CPU、内存使用率高时。HarmonyOS对后台任务有严格的资源管理机制,确保前台应用流畅运行。

  2. 权限与声明:确认worker所需的权限是否已在manifest文件中正确声明,并获得了用户授权。HarmonyOS对权限管理有严格规定,未声明的权限将导致功能异常。

  3. API兼容性:检查使用的API是否兼容当前HarmonyOS版本。HarmonyOS不断更新,某些API可能在新版本中已变更或废弃。

  4. 日志与调试:利用HarmonyOS提供的日志系统,查看worker运行时的详细日志,分析异常原因。同时,可以使用调试工具进行断点调试,定位问题代码。

  5. 生命周期管理:确保worker的生命周期管理正确,如避免在worker销毁后继续发送消息或执行操作。

  6. 异常处理:检查worker中的异常处理逻辑,确保在发生异常时能够正确捕获并处理,避免程序崩溃。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部