1# TaskPool任务与宿主线程通信 2<!--Kit: ArkTS--> 3<!--Subsystem: CommonLibrary--> 4<!--Owner: @lijiamin2025--> 5<!--Designer: @weng-changcheng--> 6<!--Tester: @kirl75; @zsw_zhushiwei--> 7<!--Adviser: @ge-yafang--> 8 9如果Task不仅需要返回最终执行结果,还需定时通知宿主线程状态和数据变化,或分段返回大量数据(如从数据库读取大量数据),可按以下方式实现。 10 11下面以多个图片加载任务结果实时返回为例说明。 12 131. 实现接收Task消息的方法。 14 15 ```ts 16 // TaskSendDataUsage.ets 17 export function notice(data: number): void { 18 console.info("子线程任务已执行完,共加载图片: ", data); 19 } 20 ``` 21 <!-- @[receive_task_message](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/ArkTsConcurrent/ConcurrentThreadCommunication/InterThreadCommunicationScenario/entry/src/main/ets/managers/TaskSendDataUsage.ets) --> 22 232. 在需要执行的Task中,添加sendData()接口将消息发送给宿主线程。 24 25 ```ts 26 // IconItemSource.ets 27 export class IconItemSource { 28 image: string | Resource = ''; 29 text: string | Resource = ''; 30 31 constructor(image: string | Resource = '', text: string | Resource = '') { 32 this.image = image; 33 this.text = text; 34 } 35 } 36 ``` 37 <!-- @[implement_child_thread_task](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/ArkTsConcurrent/ConcurrentThreadCommunication/InterThreadCommunicationScenario/entry/src/main/ets/managers/IconItemSource.ets) --> 38 39 ```ts 40 // TaskSendDataUsage.ets 41 import { taskpool } from '@kit.ArkTS'; 42 import { IconItemSource } from './IconItemSource'; 43 44 // 通过Task的sendData方法,即时通知宿主线程信息 45 @Concurrent 46 export function loadPictureSendData(count: number): IconItemSource[] { 47 let iconItemSourceList: IconItemSource[] = []; 48 // 遍历添加6*count个IconItem的数据 49 for (let index = 0; index < count; index++) { 50 const numStart: number = index * 6; 51 // 此处循环使用6张图片资源 52 iconItemSourceList.push(new IconItemSource('$media:startIcon', `item${numStart + 1}`)); 53 iconItemSourceList.push(new IconItemSource('$media:background', `item${numStart + 2}`)); 54 iconItemSourceList.push(new IconItemSource('$media:foreground', `item${numStart + 3}`)); 55 iconItemSourceList.push(new IconItemSource('$media:startIcon', `item${numStart + 4}`)); 56 iconItemSourceList.push(new IconItemSource('$media:background', `item${numStart + 5}`)); 57 iconItemSourceList.push(new IconItemSource('$media:foreground', `item${numStart + 6}`)); 58 59 taskpool.Task.sendData(iconItemSourceList.length); 60 } 61 return iconItemSourceList; 62 } 63 ``` 64 <!-- @[implement_child_thread_task](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/ArkTsConcurrent/ConcurrentThreadCommunication/InterThreadCommunicationScenario/entry/src/main/ets/managers/TaskSendDataUsage.ets) --> 65 663. 最后,在宿主线程通过onReceiveData()接口接收消息。 67 这样宿主线程就可以通过notice()接口接收到Task发送的数据。 68 69 ```ts 70 // Index.ets 71 import { taskpool } from '@kit.ArkTS'; 72 import { IconItemSource } from './IconItemSource'; 73 import { loadPictureSendData, notice } from './TaskSendDataUsage'; 74 75 @Entry 76 @Component 77 struct Index { 78 @State message: string = 'Hello World'; 79 80 build() { 81 Row() { 82 Column() { 83 Text(this.message) 84 .fontSize(50) 85 .fontWeight(FontWeight.Bold) 86 .onClick(async () => { 87 let iconItemSourceList: IconItemSource[] = []; 88 let loadPictureTask: taskpool.Task = new taskpool.Task(loadPictureSendData, 30); 89 // 设置notice方法接收Task发送的消息 90 loadPictureTask.onReceiveData(notice); 91 iconItemSourceList = await taskpool.execute(loadPictureTask) as IconItemSource[]; 92 console.info("The length of iconItemSourceList is " + iconItemSourceList.length); 93 }) 94 } 95 .width('100%') 96 } 97 .height('100%') 98 } 99 } 100 ``` 101 <!-- @[receive_task_data](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/ArkTsConcurrent/ConcurrentThreadCommunication/InterThreadCommunicationScenario/entry/src/main/ets/managers/TaskSendDataUsage.ets) --> 102