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