文档管理中心
指南应用框架ArkTS(方舟编程语言)ArkTS并发并发线程间通信线程间通信场景TaskPool任务与宿主线程通信

TaskPool任务与宿主线程通信

如果Task不仅需要返回最终执行结果,还需定时通知宿主线程状态和数据变化,或分段返回大量数据(如从数据库读取大量数据),可按以下方式实现。

下面以多个图片加载任务结果实时返回为例说明。

在需要执行的Task中,添加sendData()接口将消息发送给宿主线程。在宿主线程通过onReceiveData()接口接收消息。这样宿主线程就可以通过notice()接口接收到Task发送的数据。

收起
自动换行
深色代码主题
复制
  1. export class IconItemSource {
  2. image: string | Resource = '';
  3. text: string | Resource = '';
  4. constructor(image: string | Resource = '', text: string | Resource = '') {
  5. this.image = image;
  6. this.text = text;
  7. }
  8. }
收起
自动换行
深色代码主题
复制
  1. import { taskpool } from '@kit.ArkTS';
  2. import { IconItemSource } from './IconItemSource';
  3. // 实现接收Task消息的方法
  4. function notice(data: number): void {
  5. console.info('子线程已加载数据,共加载图片: ', data);
  6. }
  7. // 通过Task的sendData方法,即时通知宿主线程信息
  8. @Concurrent
  9. export function loadPictureSendData(count: number): IconItemSource[] {
  10. let iconItemSourceList: IconItemSource[] = [];
  11. // 遍历添加6*count个IconItem的数据
  12. for (let index = 0; index < count; index++) {
  13. const numStart: number = index * 6;
  14. // 此处循环使用6张图片资源
  15. iconItemSourceList.push(new IconItemSource('$media:startIcon', `item${numStart + 1}`));
  16. iconItemSourceList.push(new IconItemSource('$media:background', `item${numStart + 2}`));
  17. iconItemSourceList.push(new IconItemSource('$media:foreground', `item${numStart + 3}`));
  18. iconItemSourceList.push(new IconItemSource('$media:startIcon', `item${numStart + 4}`));
  19. iconItemSourceList.push(new IconItemSource('$media:background', `item${numStart + 5}`));
  20. iconItemSourceList.push(new IconItemSource('$media:foreground', `item${numStart + 6}`));
  21. taskpool.Task.sendData(iconItemSourceList.length);
  22. }
  23. return iconItemSourceList;
  24. }
  25. @Entry
  26. @Component
  27. struct Index {
  28. @State message: string = 'Hello World';
  29. build() {
  30. Row() {
  31. Column() {
  32. Text(this.message)
  33. .fontSize(50)
  34. .fontWeight(FontWeight.Bold)
  35. .onClick(() => {
  36. let iconItemSourceList: IconItemSource[];
  37. let loadPictureTask: taskpool.Task = new taskpool.Task(loadPictureSendData, 30);
  38. // 设置notice方法接收Task发送的消息
  39. loadPictureTask.onReceiveData(notice);
  40. taskpool.execute(loadPictureTask).then((res: object) => {
  41. iconItemSourceList = res as IconItemSource[];
  42. this.message = 'success';
  43. }).catch((e: BusinessError) => {
  44. this.message = 'failed';
  45. console.error(`taskpool: execute: Code: ${e.code}, message: ${e.message}`);
  46. })
  47. })
  48. }
  49. .width('100%')
  50. }
  51. .height('100%')
  52. }
  53. }
在 指南 中进行搜索
请输入您想要搜索的关键词