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