跳到主要内容

常驻任务开发指导(Worker)

提供使用Worker进行常驻任务的开发指导。Worker将持续执行任务,直到宿主线程发送终止指令。

开发过程和示例如下:

  1. DevEco Studio支持一键生成Worker,在对应的{moduleName}目录下任意位置,单击鼠标右键 > New > Worker,即可自动生成Worker的模板文件及配置信息。本文以创建“Worker”为例。

    此外,还支持手动创建Worker文件。具体方式和注意事项请参见创建Worker的注意事项

  2. 首先导入Worker模块,然后在宿主线程中通过调用ThreadWorker的constructor()方法创建Worker对象,创建Worker对象的线程为宿主线程。 此处的宿主线程为UI主线程,宿主线程发送'start'以开始执行某个长期运行的任务,并接收子线程返回的相关消息。当不需要执行该任务时,发送'stop'以停止该任务的执行。在此示例中,任务将在10秒后结束。

    import { worker } from '@kit.ArkTS';
    import resource from '../util/resource';

    const workerInstance: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/Worker.ets');

    @Entry
    @Component
    struct Index {
    @State message: string = 'Listener task';

    build() {
    Column() {
    Text(this.message)
    .id('HelloWorld')
    .fontSize(50)
    .fontWeight(FontWeight.Bold)
    .onClick(() => {
    workerInstance.postMessage({ type: 'End' });
    workerInstance.onmessage = (event) => {
    console.info(resource.resourceToString($r('app.string.Information')), event.data);
    }
    // 10秒后停止worker
    setTimeout(() => {
    workerInstance.postMessage({ type: 'stop' });
    }, 10000);
    this.message = 'success';
    })
    }
    .height('100%')
    .width('100%')
    }
    }
  3. 在Worker线程中,当接收到宿主线程发送的消息为'start'时,开始执行某个长时间不定期运行的任务,并实时向宿主线程返回消息。当接收到的消息为'stop'时,结束该任务的执行并返回相应的消息给宿主线程。

    import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
    const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
    let isRunning = false;
    workerPort.onmessage = (e: MessageEvents) => {
    const type = e.data.type as string;
    if (type === 'End') {
    if (!isRunning) {
    isRunning = true;
    // 开始常驻任务
    performTask();
    }
    } else if (type === 'stop') {
    isRunning = false;
    workerPort.close(); // 关闭Worker
    }
    }
    // 模拟常驻任务
    function performTask() {
    if (isRunning) {
    // 模拟某个长期运行的任务
    workerPort.postMessage('Worker is performing a task');
    // 1秒后再次执行任务
    setTimeout(performTask, 1000);
    }
    workerPort.postMessage('Worker is stop performing a task');
    }