• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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