• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Worker同步调用宿主线程的接口
2
3如果一个接口已在宿主线程中实现,Worker可以通过以下方式调用该接口。
4
5以下示例展示了Worker如何同步调用宿主线程的接口。
6
71. 首先,在宿主线程实现需要调用的接口,并创建Worker对象,在Worker对象上注册需要调用的对象。
8
9   ```ts
10   // IconItemSource.ets
11   export class IconItemSource {
12     image: string | Resource = '';
13     text: string | Resource = '';
14
15     constructor(image: string | Resource = '', text: string | Resource = '') {
16       this.image = image;
17       this.text = text;
18     }
19   }
20   ```
21
22   ```ts
23   // WorkerCallGlobalUsage.ets
24   import worker from '@ohos.worker';
25   import { IconItemSource } from './IconItemSource';
26
27   // 创建Worker对象
28   const workerInstance: worker.ThreadWorker = new worker.ThreadWorker("entry/ets/pages/workers/Worker.ts");
29
30   class PicData {
31     public iconItemSourceList: IconItemSource[] = [];
32
33     public setUp(): string {
34       for (let index = 0; index < 20; index++) {
35         const numStart: number = index * 6;
36         // 此处循环使用6张图片资源
37         this.iconItemSourceList.push(new IconItemSource('$media:startIcon', `item${numStart + 1}`));
38         this.iconItemSourceList.push(new IconItemSource('$media:background', `item${numStart + 2}`));
39         this.iconItemSourceList.push(new IconItemSource('$media:foreground', `item${numStart + 3}`));
40         this.iconItemSourceList.push(new IconItemSource('$media:startIcon', `item${numStart + 4}`));
41         this.iconItemSourceList.push(new IconItemSource('$media:background', `item${numStart + 5}`));
42         this.iconItemSourceList.push(new IconItemSource('$media:foreground', `item${numStart + 6}`));
43
44       }
45       return "setUpIconItemSourceList success!";
46     }
47   }
48
49   let picData = new PicData();
50   // 在Worker上注册需要调用的对象
51   workerInstance.registerGlobalCallObject("picData", picData);
52   workerInstance.postMessage("run setUp in picData");
53   ```
54
552. 然后,在Worker中通过callGlobalCallObjectMethod接口可以调用宿主线程中的setUp()方法。
56
57   ```ts
58   // Worker.ets
59   import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
60   const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
61   try {
62     // 调用方法无入参
63     let res: string = workerPort.callGlobalCallObjectMethod("picData", "setUp", 0) as string;
64     console.error("worker: ", res);
65   } catch (error) {
66     // 异常处理
67     console.error("worker: error code is " + error.code + " error message is " + error.message);
68   }
69   ```
70