1e41f4b71Sopenharmony_ci# TaskPool任务与主线程通信 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci如果一个Task,不仅需要返回最后的执行结果,而且需要定时通知主线程状态、数据的变化,或者需要分段返回数量级较大的数据(比如从数据库中读取大量数据),可以通过下面这种方式实现。 4e41f4b71Sopenharmony_ci 5e41f4b71Sopenharmony_ci下面以多个图片加载任务结果实时返回为例进行说明。 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ci1. 首先,实现一个方法,用来接收Task发送的消息。 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci ```ts 10e41f4b71Sopenharmony_ci // TaskSendDataUsage.ets 11e41f4b71Sopenharmony_ci function notice(data: number): void { 12e41f4b71Sopenharmony_ci console.info("子线程任务已执行完,共加载图片: ", data); 13e41f4b71Sopenharmony_ci } 14e41f4b71Sopenharmony_ci ``` 15e41f4b71Sopenharmony_ci 16e41f4b71Sopenharmony_ci2. 然后,在Task需要执行的任务中,添加sendData()接口将消息发送给主线程。 17e41f4b71Sopenharmony_ci 18e41f4b71Sopenharmony_ci ```ts 19e41f4b71Sopenharmony_ci // IconItemSource.ets 20e41f4b71Sopenharmony_ci export class IconItemSource { 21e41f4b71Sopenharmony_ci image: string | Resource = ''; 22e41f4b71Sopenharmony_ci text: string | Resource = ''; 23e41f4b71Sopenharmony_ci 24e41f4b71Sopenharmony_ci constructor(image: string | Resource = '', text: string | Resource = '') { 25e41f4b71Sopenharmony_ci this.image = image; 26e41f4b71Sopenharmony_ci this.text = text; 27e41f4b71Sopenharmony_ci } 28e41f4b71Sopenharmony_ci } 29e41f4b71Sopenharmony_ci ``` 30e41f4b71Sopenharmony_ci 31e41f4b71Sopenharmony_ci ```ts 32e41f4b71Sopenharmony_ci // TaskSendDataUsage.ets 33e41f4b71Sopenharmony_ci import { taskpool } from '@kit.ArkTS'; 34e41f4b71Sopenharmony_ci import { IconItemSource } from './IconItemSource'; 35e41f4b71Sopenharmony_ci 36e41f4b71Sopenharmony_ci // 通过Task的sendData方法,即时通知主线程信息 37e41f4b71Sopenharmony_ci @Concurrent 38e41f4b71Sopenharmony_ci export function loadPictureSendData(count: number): IconItemSource[] { 39e41f4b71Sopenharmony_ci let iconItemSourceList: IconItemSource[] = []; 40e41f4b71Sopenharmony_ci // 遍历添加6*count个IconItem的数据 41e41f4b71Sopenharmony_ci for (let index = 0; index < count; index++) { 42e41f4b71Sopenharmony_ci const numStart: number = index * 6; 43e41f4b71Sopenharmony_ci // 此处循环使用6张图片资源 44e41f4b71Sopenharmony_ci iconItemSourceList.push(new IconItemSource('$media:startIcon', `item${numStart + 1}`)); 45e41f4b71Sopenharmony_ci iconItemSourceList.push(new IconItemSource('$media:background', `item${numStart + 2}`)); 46e41f4b71Sopenharmony_ci iconItemSourceList.push(new IconItemSource('$media:foreground', `item${numStart + 3}`)); 47e41f4b71Sopenharmony_ci iconItemSourceList.push(new IconItemSource('$media:startIcon', `item${numStart + 4}`)); 48e41f4b71Sopenharmony_ci iconItemSourceList.push(new IconItemSource('$media:background', `item${numStart + 5}`)); 49e41f4b71Sopenharmony_ci iconItemSourceList.push(new IconItemSource('$media:foreground', `item${numStart + 6}`)); 50e41f4b71Sopenharmony_ci 51e41f4b71Sopenharmony_ci taskpool.Task.sendData(iconItemSourceList.length); 52e41f4b71Sopenharmony_ci } 53e41f4b71Sopenharmony_ci return iconItemSourceList; 54e41f4b71Sopenharmony_ci } 55e41f4b71Sopenharmony_ci ``` 56e41f4b71Sopenharmony_ci 57e41f4b71Sopenharmony_ci3. 最后,在主线程通过onReceiveData()接口接收消息。 58e41f4b71Sopenharmony_ci 这样主线程就可以通过notice()接口接收到Task发送的数据。 59e41f4b71Sopenharmony_ci 60e41f4b71Sopenharmony_ci ```ts 61e41f4b71Sopenharmony_ci // TaskSendDataUsage.ets 62e41f4b71Sopenharmony_ci @Entry 63e41f4b71Sopenharmony_ci @Component 64e41f4b71Sopenharmony_ci struct Index { 65e41f4b71Sopenharmony_ci @State message: string = 'Hello World'; 66e41f4b71Sopenharmony_ci 67e41f4b71Sopenharmony_ci build() { 68e41f4b71Sopenharmony_ci Row() { 69e41f4b71Sopenharmony_ci Column() { 70e41f4b71Sopenharmony_ci Text(this.message) 71e41f4b71Sopenharmony_ci .fontSize(50) 72e41f4b71Sopenharmony_ci .fontWeight(FontWeight.Bold) 73e41f4b71Sopenharmony_ci .onClick(() => { 74e41f4b71Sopenharmony_ci let iconItemSourceList: IconItemSource[]; 75e41f4b71Sopenharmony_ci let lodePictureTask: taskpool.Task = new taskpool.Task(loadPictureSendData, 30); 76e41f4b71Sopenharmony_ci // 设置notice方法接收Task发送的消息 77e41f4b71Sopenharmony_ci lodePictureTask.onReceiveData(notice); 78e41f4b71Sopenharmony_ci taskpool.execute(lodePictureTask).then((res: object) => { 79e41f4b71Sopenharmony_ci iconItemSourceList = res as IconItemSource[]; 80e41f4b71Sopenharmony_ci }) 81e41f4b71Sopenharmony_ci }) 82e41f4b71Sopenharmony_ci } 83e41f4b71Sopenharmony_ci .width('100%') 84e41f4b71Sopenharmony_ci } 85e41f4b71Sopenharmony_ci .height('100%') 86e41f4b71Sopenharmony_ci } 87e41f4b71Sopenharmony_ci } 88e41f4b71Sopenharmony_ci ``` 89