HarmonyOS鸿蒙Next中怎么在一个应用中实现单worker,其他的页面都可以使用

HarmonyOS鸿蒙Next中怎么在一个应用中实现单worker,其他的页面都可以使用 在单独的har包中单独封装了一个worker的class类
导出给hap包调用
遇到的问题:
每个页面调用的时候都会生成新的Worker线程,导致多个worker线程同时收到消息执行任务
希望实现:
如何实现全局单个worker线程,希望提供相关技术思路

3 回复

1、workerClass:

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

export class workerClass {
  private static ins: workerClass | null = null;
  private myWorker: worker.ThreadWorker | null = null;

  static getIns(): workerClass {
    if (!workerClass.ins) {
      workerClass.ins = new workerClass();
    }
    return workerClass.ins;
  }

  constructor() {
    workerClass.ins = this;
  }

  /**
   * 新创建一个worker,会覆盖之前的worker
   */
  createNewWorker() {
    if (!workerClass.ins) {
      workerClass.getIns();
    }
    if (workerClass.ins != null) {
      workerClass.ins.myWorker = new worker.ThreadWorker('entry/ets/workers/WorkerIns');
    }
  }

  /**
   * @param msg message
   */
  promptAction(msg: string = "默认的msg") {
    promptAction.showToast({
      message: msg
    })
  }
}

2、workerIns:

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) => {
}

/**
 * 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) => {
}

3、使用:

Button("第一个").onClick(() => {
  workerClass.getIns().promptAction()
})

Button("第二个").onClick(() => {
  workerClass.getIns().promptAction("新的消息")
})

更多关于HarmonyOS鸿蒙Next中怎么在一个应用中实现单worker,其他的页面都可以使用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,可以通过使用Worker来实现后台任务处理。要实现一个应用中单Worker,其他页面都可以使用,可以按照以下步骤进行:

  1. 创建Worker: 在项目的entry/src/main/ets/workers目录下创建一个Worker文件,例如MyWorker.ets。在该文件中定义Worker的逻辑。

    // MyWorker.ets
    import worker from '[@ohos](/user/ohos).worker';
    
    const workerPort = worker.workerPort;
    
    workerPort.onmessage = function(e) {
        // 处理接收到的消息
        const data = e.data;
        // 执行任务
        const result = processData(data);
        // 发送结果
        workerPort.postMessage(result);
    };
    
    function processData(data) {
        // 处理数据的逻辑
        return data + " processed";
    }
    
  2. 在页面中调用Worker: 在需要使用Worker的页面中,通过WorkerpostMessage方法发送消息,并监听Worker返回的消息。

    // MainPage.ets
    import worker from '[@ohos](/user/ohos).worker';
    
    [@Entry](/user/Entry)
    [@Component](/user/Component)
    struct MainPage {
        private myWorker: worker.Worker;
    
        aboutToAppear() {
            this.myWorker = new worker.Worker('entry/ets/workers/MyWorker');
            this.myWorker.onmessage = function(e) {
                // 处理Worker返回的消息
                console.log("Received from Worker: " + e.data);
            };
        }
    
        private sendMessageToWorker() {
            this.myWorker.postMessage("Hello Worker");
        }
    
        build() {
            Column() {
                Button('Send Message to Worker')
                    .onClick(() => this.sendMessageToWorker())
            }
        }
    }
    
  3. 共享Worker: 如果需要多个页面共享同一个Worker,可以将Worker实例保存在全局变量或通过AppStorage进行管理,以便在其他页面中访问。

    // App.ets
    import { AppStorage } from '[@ohos](/user/ohos).application.AppStorage';
    import worker from '[@ohos](/user/ohos).worker';
    
    AppStorage.setOrCreate('myWorker', new worker.Worker('entry/ets/workers/MyWorker'));
    
    // OtherPage.ets
    import { AppStorage } from '[@ohos](/user/ohos).application.AppStorage';
    
    [@Entry](/user/Entry)
    [@Component](/user/Component)
    struct OtherPage {
        private myWorker = AppStorage.get('myWorker');
    
        private sendMessageToWorker() {
            this.myWorker.postMessage("Hello from Other Page");
        }
    
        build() {
            Column() {
                Button('Send Message to Worker')
                    .onClick(() => this.sendMessageToWorker())
            }
        }
    }
    

通过以上步骤,可以在HarmonyOS鸿蒙Next中实现一个应用中单Worker,其他页面都可以使用。

在HarmonyOS鸿蒙Next中实现单Worker,可以通过以下步骤:

  1. 创建Worker:在src/main/ets/workers目录下创建Worker文件,如SingleWorker.ts

  2. 初始化Worker:在应用入口文件(如EntryAbility.ts)中初始化Worker,并确保全局唯一实例。

  3. 页面调用:在其他页面中通过postMessageonmessage与Worker通信。

// SingleWorker.ts
import worker from '@ohos.worker';

const workerPort = worker.workerPort;

workerPort.onmessage = function(event) {
  // 处理任务
  workerPort.postMessage(result);
};

// EntryAbility.ts
import worker from '@ohos.worker';

let singleWorker = new worker.ThreadWorker('workers/SingleWorker.ts');

// 其他页面
singleWorker.postMessage(taskData);
singleWorker.onmessage = function(event) {
  // 处理结果
};

确保Worker在应用生命周期内保持单例,避免重复创建。

回到顶部