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