使用TaskPool执行独立的耗时任务
对于独立运行的耗时任务,任务完成后将结果返回给宿主线程。可采用以下方式实现。
下面通过图片加载来说明。
-
实现子线程需要执行的任务。
export class IconItemSource {image: string | Resource = '';text: string | Resource = '';constructor(image: string | Resource = '', text: string | Resource = '') {this.image = image;this.text = text;}}import { IconItemSource } from './IconItemSource';// 在Task中执行的方法,需要添加@Concurrent注解,否则无法正常调用。@Concurrentexport function loadPicture(count: number): IconItemSource[] {let iconItemSourceList: IconItemSource[] = [];// 遍历添加6*count个IconItem的数据for (let index = 0; index < count; index++) {const numStart: number = index * 6;// 此处循环使用6张图片资源iconItemSourceList.push(new IconItemSource('$media:startIcon', `item${numStart + 1}`));iconItemSourceList.push(new IconItemSource('$media:background', `item${numStart + 2}`));iconItemSourceList.push(new IconItemSource('$media:foreground', `item${numStart + 3}`));iconItemSourceList.push(new IconItemSource('$media:startIcon', `item${numStart + 4}`));iconItemSourceList.push(new IconItemSource('$media:background', `item${numStart + 5}`));iconItemSourceList.push(new IconItemSource('$media:foreground', `item${numStart + 6}`));}return iconItemSourceList;} -
使用TaskPool的execute方法执行任务,加载图片。
import { taskpool } from '@kit.ArkTS';import { IconItemSource } from './IconItemSource';import { loadPicture } from './IndependentTask';@Entry@Componentstruct Index {@State message: string = 'Hello World';build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {let iconItemSourceList: IconItemSource[] = [];// 创建Tasklet lodePictureTask: taskpool.Task = new taskpool.Task(loadPicture, 30);// 执行Task,并返回结果taskpool.execute(lodePictureTask).then((res: object) => {// loadPicture方法的执行结果iconItemSourceList = res as IconItemSource[];})this.message = 'success';})}.width('100%')}.height('100%')}}