HarmonyOS 鸿蒙Next worker 如何传参数?

发布于 1周前 作者 nodeper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next worker 如何传参数?

主线程向worker 线程如何传多个参数,多个字符串,数字?主线程如何接受子线程的返回值两个boolean值,可以提供一个样例参考么?官方文档没有特别复杂的传参
 

2 回复

这边写了一个demo,你参考一下

Index1.ets

import worker, { MessageEvents } from '@ohos.worker';
export class StudentInfo {
  id: number = 0
  name: string = ''
  age: number = 1
  salary:number = 0
  gender:boolean = false
}

export const  nameArr = ['jack','tom','anlay','jany','lili','Aaron','Ben','Brandon','Cody','Mason']

const gworkerInstance = new worker.ThreadWorker("entry/ets/workers/GlobalWorker.ets");

let context = getContext()
@Entry
@Component
struct Index1 {
  @State list: StudentInfo[] = [];
  aboutToAppear(): void {
    gworkerInstance.postMessage({code:99,data:1});
    gworkerInstance.onmessage = (e:MessageEvents):void=>{
      if(e.data.code == 101){
        this.list = e.data.data
      }
    }
  }

  build() {
    Row() {
      Column() {
        Row(){
          Button('建表')
            .onClick(() => {
              gworkerInstance.postMessage({code:1,data:context});
            })
          Button('插入数据')
            .onClick(() => {
              let student:StudentInfo = new StudentInfo()
              let index = Math.ceil(Math.random()*10)%10
              student.name = nameArr[index]
              student.age = Math.ceil(Math.random()*100)%18
              student.salary = 2000 + Math.ceil(Math.random()*10000)%10000
              student.gender = index>5?true:false
              gworkerInstance.postMessage({code:2,data:student});
            })
          Button('查询数据')
            .onClick(() => {
              gworkerInstance.postMessage({code:3,data:{}});
            })
        }
        .width('100%')
        .margin({top:10})
        .justifyContent(FlexAlign.SpaceAround)

        ForEach(this.list, (item: StudentInfo, index: number) => {
          ViewA({ student: item})
        })

      }
      .height('100%')
      .width('100%')
    }
  }
}

@Component
export struct ViewA {
  student: StudentInfo = new StudentInfo();
  build() {
    Row(){
      Text("姓名:"+this.student.name)
      Text("年龄:"+this.student.age.toString())
      Text("费用:"+this.student.salary.toString())
      Text("性别:"+ (this.student.gender===true?"男":"女"))
    }.width('100%').margin({top : 10 }).justifyContent(FlexAlign.SpaceEvenly)
  }
}

GlobalWorker.ets

import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
import { StudentInfo } from '../pages/Index1';

const mworkerPort: ThreadWorkerGlobalScope = worker.workerPort;
const studentArr:StudentInfo[] = []
mworkerPort.onmessage = (e: MessageEvents) => {
  console.log('onmessage====' + JSON.stringify(e))
  if (e.data.code == 1) {

  } else if (e.data.code == 2) {
    let student = e.data.data as StudentInfo
    studentArr.push(student)

    mworkerPort.postMessage({code:101,data:[student]})
  } else if (e.data.code == 3) {

    mworkerPort.postMessage({code:101,data:studentArr})
  } else {

  }
  console.log('testtag onmessage end')
}
mworkerPort.onmessageerror = (e: MessageEvents) => {
  console.error(`workerPort.onmessageerror:${JSON.stringify(e)}`)
}
mworkerPort.onerror = (e: ErrorEvent) => {
  console.error(`workerPort.onerror:${JSON.stringify(e)}`)
}

更多关于HarmonyOS 鸿蒙Next worker 如何传参数?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,Next worker传参数可以通过以下几种方式实现:

  1. Intent传递

    • 创建一个Intent实例,使用putStringputInt等方法将参数放入Intent。
    • 调用startAbility方法,并将Intent作为参数传入,以启动目标Ability。
    • 在目标Ability的onStart方法中,通过getIntent方法获取Intent,并使用getStringgetInt等方法提取参数。
  2. 全局变量

    • 定义一个全局变量或全局对象,用于存储要传递的参数。
    • 在Next worker中修改全局变量的值。
    • 在目标Ability或组件中读取全局变量的值。
  3. 数据仓库(如SQLite、NoSQL数据库等)

    • 将参数存储到数据库中。
    • 在Next worker中插入或更新数据库记录。
    • 在目标Ability中查询数据库以获取参数。
  4. 消息队列或事件总线

    • 使用HarmonyOS提供的消息队列机制或第三方事件总线库。
    • 在Next worker中发布包含参数的事件或消息。
    • 在目标Ability中订阅事件或消息,并在事件或消息到达时处理参数。

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

回到顶部