--- name: openharmony-arkts-utils description: OpenHarmony ArkTS工具库快速参考 - 并发、TaskPool、Worker、Sendable、XML、Buffer、JSON、容器和运行时特性 --- # OpenHarmony ArkTS 工具库快速参考 OpenHarmony ArkTS工具库、并发和运行时特性的快速查找指南。 ## 概述 ArkTS提供全面的工具库,包括异步并发、多线程(TaskPool/Worker)、数据结构(XML/Buffer/JSON/容器)、运行时特性和构建工具。 **官方文档:** https://docs.openharmony.cn/ ## 📁 详细 API 参考文件 本技能文件提供概念指南和常用示例。详细 API 签名和完整示例请参考 `refs/` 文件夹: | 文件 | 内容 | 适用场景 | |------|------|----------| | [`refs/taskpool.md`](refs/taskpool.md) | TaskPool 完整 API | Task、TaskGroup、优先级、延时执行 | | [`refs/worker.md`](refs/worker.md) | Worker 完整 API | ThreadWorker、消息通信、生命周期 | | [`refs/collections.md`](refs/collections.md) | 共享容器 API | collections.Array/Map/Set (跨线程) | | [`refs/utils.md`](refs/utils.md) | ArkTSUtils API | AsyncLock、ASON、Sendable工具 | | [`refs/buffer.md`](refs/buffer.md) | Buffer API | 二进制数据处理、编码转换 | | [`refs/xml.md`](refs/xml.md) | XML API | XmlSerializer、XmlPullParser | | [`refs/containers.md`](refs/containers.md) | 线性/非线性容器 API | ArrayList、HashMap 等普通容器 | | [`refs/error-codes.md`](refs/error-codes.md) | 错误码速查表 | 10200001-10200301 错误处理 | ## 异步并发 (Promise & async/await) ### Promise **基本用法:** ```typescript const promise: Promise = new Promise((resolve: Function, reject: Function) => { setTimeout(() => { const randomNumber: number = Math.random(); if (randomNumber > 0.5) { resolve(randomNumber); } else { reject(new Error('Random number is too small')); } }, 1000); }) // 处理结果 promise.then((result: number) => { console.info(`The number for success is ${result}`); }).catch((error: Error) => { console.error(error.message); }).finally(() => { console.info('finally complete'); }) ``` **使用场景:** I/O操作(网络、文件)、定时器、轻量级非阻塞任务 > **说明:** 当Promise被reject且未通过catch方法处理时,会触发globalUnhandledRejectionDetected事件。可使用`errorManager.on('globalUnhandledRejectionDetected')`接口监听该事件,以全局捕获未处理的Promise reject。 ### async/await ```typescript async function myAsyncFunction(): Promise { try { const result: string = await new Promise((resolve: Function) => { resolve('Hello, world!'); }); console.info(result); // 输出: Hello, world! return result; } catch (e) { console.error(`Get exception: ${e}`); } } myAsyncFunction(); ``` **优势:** 以同步方式编写异步代码,通过try-catch实现更好的错误处理 > **说明:** 等待异步操作时,需将操作包在async函数中,并搭配await使用,且await关键字只在async函数内有效。 ## 多线程 - TaskPool TaskPool自动管理线程池,无需生命周期管理。系统默认启动一个任务工作线程,任务多时会自动扩容。工作线程数量上限由设备的物理核数决定。 ### 基本TaskPool使用 ```typescript import { taskpool } from '@kit.ArkTS'; @Concurrent function add(num1: number, num2: number): number { return num1 + num2; } async function concurrentFunc(): Promise { const task: taskpool.Task = new taskpool.Task(add, 1, 2); console.info(`taskpool res is: ${await taskpool.execute(task)}`); // 输出结果:taskpool res is: 3 } ``` ### TaskGroup批量执行 ```typescript @Concurrent function processData(data: number): number { return data * 2; } function executeTaskGroup() { const group = new taskpool.TaskGroup(); group.addTask(processData, 10); group.addTask(processData, 20); group.addTask(processData, 30); taskpool.execute(group).then((results: number[]) => { console.info(`Group results: ${results}`); // [20, 40, 60] }); } ``` ### 任务配置 ```typescript const task = new taskpool.Task(computeTask, 1000); // 设置优先级 task.priority = taskpool.Priority.HIGH; // HIGH, MEDIUM, LOW, IDLE // 设置ArrayBuffer转移列表(零拷贝,移动所有权) task.setTransferList([buffer]); // 设置ArrayBuffer拷贝列表(复制数据) task.setCloneList([buffer]); // 指定优先级执行 taskpool.execute(task, taskpool.Priority.HIGH); ``` ### 异步队列控制并发度 ```typescript import { taskpool } from '@kit.ArkTS'; // 创建异步队列:名称、并发数、队列大小 const asyncRunner = new taskpool.AsyncRunner("camera", 5, 5); @Concurrent function collectFrame(): void { // 采集帧数据 } for (let i = 0; i < 20; i++) { const task = new taskpool.Task(collectFrame); asyncRunner.execute(task); } ``` ### 任务取消 ```typescript @Sendable class TaskManager { taskId: number = 0; setTaskId(id: number) { this.taskId = id; } getTaskId(): number { return this.taskId; } } @Concurrent function cancelTask(manager: TaskManager) { taskpool.cancel(manager.getTaskId()); } const task = new taskpool.Task(delayedTask); taskpool.executeDelayed(2000, task); const manager = new TaskManager(); manager.setTaskId(task.taskId); taskpool.execute(cancelTask, manager); ``` ### 延时执行任务 ```typescript @Concurrent function delayedTask(): void { console.info('Delayed task executed'); } // 延时2秒执行 const task = new taskpool.Task(delayedTask); taskpool.executeDelayed(2000, task); ``` ### @Concurrent装饰器规范 | 装饰器参数 | 无 | | 装饰的函数类型 | async函数或普通函数。禁止generator、箭头函数、类方法。不支持类成员函数或者匿名函数 | | 装饰的函数内的变量类型 | 允许使用局部变量、入参和通过import引入的变量,禁止使用闭包变量 | | 使用场景限制 | 仅支持在Stage模型的工程中使用,仅支持在.ets文件中使用 | > **注意:** @Concurrent标记的函数不能访问闭包,因此函数内部不能调用当前文件的其他函数。 ### TaskPool vs Worker 对比 | 特性 | TaskPool | Worker | |------|----------|--------| | **使用场景** | 短期独立任务 | 长期后台任务 | | **线程管理** | 自动 | 手动(生命周期管理) | | **任务时长** | < 3分钟(不含异步操作耗时) | 无限制 | | **线程分配** | 系统管理 | 显式指定 | | **优先级控制** | 支持 | API 18+支持 | | **任务取消** | 支持 | 不支持 | | **线程复用** | 支持 | 不支持 | | **任务延时执行** | 支持 | 不支持 | | **任务依赖关系** | 支持 | 不支持 | | **串行队列** | 支持 | 不支持 | | **任务组** | 支持 | 不支持 | | **周期任务** | 支持 | 不支持 | | **异步队列** | 支持 | 不支持 | ### TaskPool约束和注意事项 - 任务必须使用`@Concurrent`装饰器 - 任务执行时长不能超过3分钟(不包含Promise或async/await异步调用的耗时) - 序列化传输的数据量限制为16MB - 参数必须满足序列化支持的类型,不支持@State/@Prop/@Link等装饰器修饰的复杂类型 - ArrayBuffer参数在TaskPool中默认转移,需多次使用时通过setCloneList设置拷贝 - 工作线程只能使用线程安全的库,不能使用UI相关的非线程安全库 - 不支持在TaskPool工作线程中使用AppStorage - Promise不支持跨线程传递 - Priority的IDLE优先级用于标记需要在后台运行的耗时任务,只在所有线程都空闲时触发执行 > 📖 **详细 API 参考:** [`refs/taskpool.md`](refs/taskpool.md) — Task、TaskGroup、优先级、延时执行的完整 API 签名和示例 ## 多线程 - Worker Worker提供专用的长期后台线程。同个进程下,最多支持同时开启64个Worker线程,实际数量由进程内存决定。 ### 基本Worker使用 ```typescript // 主线程 import { worker } from '@kit.ArkTS'; const workerInstance = new worker.ThreadWorker('entry/ets/workers/Worker.ets'); // 发送消息 workerInstance.postMessage('hello world'); // 接收消息 workerInstance.onmessage = (event: MessageEvents) => { console.info(`Received: ${event.data}`); }; // 捕获全局异常(推荐) workerInstance.onAllErrors = (error: ErrorEvent) => { console.error(`Worker error: ${error.message}`); // 异常后Worker线程继续运行 }; // 销毁Worker workerInstance.terminate(); ``` **Worker线程 (Worker.ets):** ```typescript import { worker } from '@kit.ArkTS'; const workerPort = worker.workerPort; workerPort.onmessage = (event: MessageEvents) => { const data = event.data; // 处理数据 workerPort.postMessage({ result: 'done' }); }; ``` ### Worker通信模式 **即时消息传递:** ```typescript // 主线程 → Worker workerInstance.postMessage(message); // Worker → 主线程 workerPort.postMessage(result); ``` **同步调用:** ```typescript // 在Worker中同步调用主线程方法 const result = workerPort.syncCall(method, params); ``` ### Worker生命周期管理 ```typescript // 创建Worker const workerInstance = new worker.ThreadWorker('entry/ets/workers/Worker.ets', { type: 'classic' // 或 'module' 类型 }); // 监听退出事件 workerInstance.onexit = () => { console.info('Worker terminated'); isTerminate = true; }; // 销毁Worker workerInstance.terminate(); // 等待Worker完全退出 while (!isTerminate) { await promiseCase(); } ``` ### Worker错误处理 ```typescript // 推荐使用onAllErrors捕获所有异常 workerInstance.onAllErrors = (error: ErrorEvent) => { console.error(`Type: ${error.type}, Message: ${error.message}`); // 异常后Worker线程继续运行 }; // onerror仅捕获onmessage回调中的同步异常 workerInstance.onerror = (error: ErrorEvent) => { console.error(`Error: ${error.message}`); // 异常后Worker线程进入销毁流程 }; ``` ### Worker vs TaskPool 选择 **推荐使用TaskPool的场景:** - 运行时间不超过3分钟的独立任务 - CPU密集型任务(图像处理、数据分析) - I/O密集型任务(文件读写、网络请求) - 需要设置优先级的任务 - 需要频繁取消的任务 - 大量或调度点分散的任务 **推荐使用Worker的场景:** - 运行时间超过3分钟的长时任务 - 有关联的一系列同步任务(使用同一句柄) - 需要指定运行线程的任务 > 📖 **详细 API 参考:** [`refs/worker.md`](refs/worker.md) — ThreadWorker、消息通信、生命周期管理的完整 API ## Sendable - 跨线程共享对象 Sendable启用安全的对象跨线程共享。Sendable对象分配在共享堆(SharedHeap)中,实现跨并发实例的内存共享。 ### 基本@Sendable使用 ```typescript @Sendable class SendableTestClass { desc: string = "sendable: this is SendableTestClass "; num: number = 5; printName() { console.info("sendable: SendableTestClass desc is: " + this.desc); } getNum(): number { return this.num; } } // 可直接传递给TaskPool/Worker,无需拷贝 const data = new SendableTestClass(); taskpool.execute(task, data); ``` ### @Sendable函数使用 ```typescript @Sendable type SendableFuncType = () => void; @Sendable function TopLevelSendableFunction() { console.info("Top level sendable function"); } @Sendable class SendableTestClass { callback: SendableFuncType; constructor(func: SendableFuncType) { this.callback = func; } CallSendableFunc() { TopLevelSendableFunction(); } } ``` ### @Sendable装饰器规范 | 装饰器参数 | 无 | | 使用场景限制 | 仅支持在Stage模型的.ets文件中使用 | | 装饰的类继承关系限制 | Sendable class只能继承Sendable class,普通class不可继承Sendable class | | 装饰的对象内的属性类型限制 | 支持string、number、boolean、bigint、null、undefined、Sendable class、collections容器集、ArkTSUtils.locks.AsyncLock等。禁止使用闭包变量(顶层Sendable类和函数除外) | | 装饰的对象内的属性的其他限制 | 成员属性必须显式初始化,不能使用感叹号。不支持增加或删除属性,允许修改属性,修改前后类型必须一致 | | 适用场景 | 1. 在TaskPool或Worker中使用类方法或Sendable函数
2. 传输对象数据量较大的场景(100KB数据效率提升约20倍,1M数据效率提升约100倍) | ### Sendable支持的数据类型 **基本数据类型:** - boolean、number、string、bigint、null、undefined **容器类型**(需显式引入@arkts.collections): - collections.Array、collections.Map、collections.Set - collections.TypedArray(Int8Array、Uint8Array等) - collections.ArrayBuffer **并发工具类型**(需显式引入@arkts.utils): - ArkTSUtils.locks.AsyncLock - ArkTSUtils.locks.ConditionVariable - ArkTSUtils.SendableLruCache **复合类型:** - 标注了@Sendable装饰器的class - 标注了@Sendable装饰器的function - 继承了ISendable的interface - 元素均为Sendable类型的union type > **注意:** JS内置对象在并发实例间传递时遵循结构化克隆算法,跨线程行为是拷贝传递。对象字面量和数组字面量也不是Sendable类型。 ### 共享容器 ```typescript import { collections, ArkTSUtils, taskpool } from '@kit.ArkTS'; // 共享Array const arr = collections.Array.create(100, 0); // 共享Map const map = new collections.Map(); map.set('key1', 100); // 配合异步锁使用(防止并发修改) @Concurrent async function add(arr: collections.Array, lock: ArkTSUtils.locks.AsyncLock) { await lock.lockAsync(() => { arr[0]++; }) } ``` > **说明:** ArkTS共享容器不是线程安全的,内部使用了fail-fast机制。在多线程场景下修改容器内属性时,需要使用ArkTS提供的异步锁机制保证安全访问。 > 📖 **详细 API 参考:** [`refs/collections.md`](refs/collections.md) — collections.Array/Map/Set 跨线程共享容器完整 API ### 异步锁 (AsyncLock) ```typescript import { ArkTSUtils, taskpool } from '@kit.ArkTS'; @Sendable export class A { private count_: number = 0; lock_: ArkTSUtils.locks.AsyncLock = new ArkTSUtils.locks.AsyncLock(); public getCount(): Promise { return this.lock_.lockAsync(() => { return this.count_; }) } public async increaseCount() { await this.lock_.lockAsync(() => { this.count_++; }) } } @Concurrent async function printCount(a: A) { a.increaseCount(); console.info("InputModule: count is:" + await a.getCount()); } ``` ### 条件变量 (ConditionVariable) ```typescript import { ArkTSUtils } from '@kit.ArkTS'; const conditionVariable: ArkTSUtils.locks.ConditionVariable = new ArkTSUtils.locks.ConditionVariable(); // 等待条件(无限等待) await conditionVariable.wait(); // 等待条件(超时等待) await conditionVariable.waitFor(timeout); // 唤醒一个等待线程 conditionVariable.notifyOne(); // 唤醒所有等待线程 conditionVariable.notifyAll(); ``` ### 共享模块 ```typescript // sharedModule.ets "use shared" @Sendable class GlobalCounter { private count_: number = 0; lock_: ArkTSUtils.locks.AsyncLock = new ArkTSUtils.locks.AsyncLock(); async increment(): Promise { return this.lock_.lockAsync(() => { return ++this.count_; }); } } export let globalCounter = new GlobalCounter(); ``` **共享模块约束:** - 共享模块只支持.ets文件 - 共享模块内不允许使用side-effects-import - 共享模块导出的所有对象必须是可共享的Sendable类型 - 共享模块不支持re-export写法 > 📖 **详细 API 参考:** [`refs/utils.md`](refs/utils.md) — AsyncLock、ConditionVariable、ASON、LruCache 完整 API ## 容器库 ### ArkTS共享容器 (@arkts.collections) | 容器 | 用途 | 特性 | |------|------|------| | **collections.Array** | 动态数组,引用传递,跨线程高效 | 支持push、pop、splice、forEach等 | | **collections.Map** | 键值对集合,引用传递 | 支持set、get、has、delete等 | | **collections.Set** | 值集合,引用传递 | 支持add、has、delete等 | | **collections.TypedArray** | 类型化数组(Int8Array、Uint8Array等) | 固定类型,高性能 | | **collections.ArrayBuffer** | 数组缓冲区 | 支持slice、byteLength | > **注意:** ArkTS共享容器采用引用传递方式跨线程传递,与原生容器相比效率更高。如果需要跨线程传输大量数据,建议使用ArkTS共享容器。 ### 线性容器 (@arkts.collections) | 容器 | 用途 | 复杂度 | |------|------|--------| | **ArrayList** | 动态数组,频繁读取 | O(1) 访问 | | **Vector** | 动态数组,固定类型 | O(1) 访问(已废弃,推荐ArrayList) | | **LinkedList** | 双向链表,频繁插入删除 | O(1) 插入 | | **Deque** | 双端队列,头尾操作 | O(1) 头尾 | | **List** | 单向链表,频繁插入删除 | O(1) 插入 | | **Queue** | 队列,先进先出 | O(1) 入队/出队 | | **Stack** | 栈,先进后出 | O(1) push/pop | **ArrayList示例:** ```typescript import { collections } from '@kit.ArkTS'; const list = new collections.ArrayList(); list.add('item1'); list.add('item2'); list.has('item1'); // true list.remove(0); const size = list.size; ``` ### 非线性容器 (@arkts.collections) | 容器 | 用途 | 顺序 | |------|------|------| | **HashMap** | 哈希映射,快速存取 | 无序 | | **HashSet** | 哈希集合,唯一值 | 无序 | | **TreeMap** | 有序映射,支持自定义排序 | 按键排序 | | **TreeSet** | 有序集合,支持自定义排序 | 按值排序 | | **LightWeightMap** | 轻量级映射,内存占用小 | 无序 | | **LightWeightSet** | 轻量级集合,内存占用小 | 无序 | | **PlainArray** | 轻量级数组,键为number类型 | - | **HashMap示例:** ```typescript import { collections } from '@kit.ArkTS'; const map = new collections.HashMap(); map.set('key1', 100); map.set('key2', 200); map.has('key1'); // true const value = map.get('key1'); // 100 ``` ### 线性 vs 非线性容器 - **线性容器**:按顺序访问,底层基于数组或链表实现。优化数据访问速度,适合频繁读取元素或顺序操作 - **非线性容器**:快速查找,底层基于哈希或红黑树实现。支持快速查找,key/value类型符合ECMA标准 > 📖 **详细 API 参考:** [`refs/containers.md`](refs/containers.md) — ArrayList、HashMap、TreeMap 等普通容器完整 API ## XML处理 ### XML生成 ```typescript import { xml, util } from '@kit.ArkTS'; // 方式1:使用XmlSerializer(固定缓冲区) let arrayBuffer: ArrayBuffer = new ArrayBuffer(2048); let serializer: xml.XmlSerializer = new xml.XmlSerializer(arrayBuffer); serializer.setDeclaration(); // 写入XML声明 serializer.startElement('bookstore'); serializer.startElement('book'); serializer.setAttributes('category', 'COOKING'); serializer.startElement('title'); serializer.setAttributes('lang', 'en'); serializer.setText('Everyday'); serializer.endElement(); serializer.startElement('author'); serializer.setText('Giana'); serializer.endElement(); serializer.endElement(); serializer.endElement(); // 方式2:使用XmlDynamicSerializer(动态扩容) let DySerializer = new xml.XmlDynamicSerializer('utf-8'); DySerializer.setDeclaration(); DySerializer.startElement('bookstore'); // ... 添加元素 let arrayBuffer = DySerializer.getOutput(); // 解码输出 let uint8Array: Uint8Array = new Uint8Array(arrayBuffer); let result: string = util.TextDecoder.create().decodeToString(uint8Array); console.info(result); ``` ### XML解析 ```typescript import { xml } from '@kit.ArkTS'; const xmlString = 'UserSystem'; // 使用XmlPullParser解析 let parser = new xml.XmlPullParser(xmlString); parser.parseXml({ supportDoctype: true, ignoreNameSpace: true, tagValueCallbackFunction: (name, value) => { console.info(`Tag: ${name}, Value: ${value}`); } }); ``` ### XML转换 ```typescript import { xml } from '@kit.ArkTS'; // 将XML转换为JavaScript对象 const jsonObj = xml.fastConvertToJSObject(xmlString, { trim: true, declarationKey: '_declaration', attributesKey: '_attributes' }); // 转换结果示例: // { // "_declaration": {"_attributes": {"version": "1.0", "encoding": "UTF-8"}}, // "note": { // "_attributes": {"priority": "high"}, // "to": "User", // "from": "System" // } // } ``` > 📖 **详细 API 参考:** [`refs/xml.md`](refs/xml.md) — XmlSerializer、XmlPullParser、XML转换完整 API ## Buffer和二进制 ### Buffer ```typescript import { buffer } from '@kit.ArkTS'; // 创建buffer const buf = buffer.from('Hello World', 'utf-8'); // 写入 buf.writeUInt8(0, 65); // 读取 const byte = buf.readUInt8(0); // 转换 const str = buf.toString('utf-8'); const arrayBuffer = buf.buffer; ``` ### ArrayBuffer转移/拷贝 **转移(零拷贝,移动所有权):** ```typescript task.setTransferList([arrayBuffer]); // 转移后原始ArrayBuffer变为不可用 ``` **拷贝(复制数据):** ```typescript task.setCloneList([arrayBuffer]); // 拷贝后原始ArrayBuffer仍可用 ``` > 📖 **详细 API 参考:** [`refs/buffer.md`](refs/buffer.md) — Buffer 创建、读写、编码转换完整 API ## JSON工具 ```typescript import { JSON } from '@kit.ArkTS'; // 解析(支持BigInt模式) let numberText = '{"number": 10, "largeNumber": 112233445566778899}'; // 使用PARSE_AS_BIGINT模式解析大整数 let options: JSON.ParseOptions = { bigIntMode: JSON.BigIntMode.PARSE_AS_BIGINT, } let numberObj = JSON.parse(numberText, null, options) as Object; console.info(typeof (numberObj as object)?.["largeNumber"]); // bigint // 序列化(支持BigInt) let bigIntObject = BigInt(112233445566778899n); let result: string = JSON.stringify(bigIntObject); console.info(result); // 112233445566778899 // 带格式的序列化 let obj = { name: "Tom", age: 20 }; let str = JSON.stringify(obj, null, 2); // 检查属性 let hasProp = JSON.has(obj, "name"); // true // 删除属性 JSON.remove(obj, "age"); ``` **JSON扩展库特性:** - 支持BigInt解析和序列化 - 循环引用检测 - 强参数校验 - 增强的错误处理(BusinessError) - 额外方法(has/remove) ## 运行时特性 ### 动态导入 ```typescript // 常量动态导入 import('myhar').then((ns:ESObject) => { console.info(ns.add(3, 5)); }); // 异步处理 async function asyncDynamicImport() { let ns:ESObject = await import('myhar'); console.info(ns.add(3, 5)); } // 变量动态导入(需配置runtimeOnly) let packageName = 'myhar'; import(packageName).then((ns:ESObject) => { console.info(ns.add(3, 5)); }); ``` **runtimeOnly配置(仅变量动态导入需要):** ```json5 // build-profile.json5 { "buildOption": { "arkOptions": { "runtimeOnly": { "packages": ["myhar"], // 其他模块名 "sources": ["./src/main/ets/utils/Calc.ets"] // 本模块文件路径 } } } } ``` **支持的动态导入场景:** - 本地工程模块(./、../开头的路径) - HSP/HAR模块名 - 远程HAR模块名 - ohpm包名 - @system.*、@ohos.*、@arkui-x.* API - libNativeLibrary.so ### 懒导入 ```typescript // 基本语法(API 12+) import lazy { x } from "mod"; import lazy { x as v } from "mod"; import lazy x from "mod"; // API 18+ import lazy { KitClass } from "@kit.SomeKit"; // API 18+ ``` **不支持的语法:** ```typescript // 以下写法将引起编译报错 import lazy * as ns from "mod"; import lazy type { obj } from "./mod"; ``` **使用场景:** - 文件在冷启动阶段未被实际调用 - 减少冷启动时间,延迟执行到实际使用时 > **注意:** 不建议盲目增加lazy,这会增加编译和运行时的识别开销。后续执行的加载是同步加载,可能阻塞任务执行。 ### 原生模块加载 **静态导入:** ```typescript // 具名导入 import { add } from 'libentry.so'; // 默认导入 import entry from 'libentry.so'; entry.add(2, 3); // 命名空间导入 import * as entry from 'libentry.so'; entry.add(2, 3); ``` **动态导入:** ```typescript import('libentry.so').then((ns:ESObject) => { ns.default.add(2, 3); }); async function asyncDynamicImport() { let ns:ESObject = await import('libentry.so'); ns.default.add(2, 3); } ``` ### 模块副作用优化 **问题代码:** ```typescript // Bad - 导入时立即执行 console.log("Module loaded!"); export const data = 1; // Bad - 直接修改全局 globalThis.someGlobalVar = 100; // Bad - 导入时修改AppStorage AppStorage.setOrCreate("SomeAppStorageVar", 200); ``` **优化方案:** ```typescript // Good - 移除顶层代码 export const data = 1; export function initialize() { console.log("Module loaded!"); } // Good - 延迟到需要时执行 export function changeGlobalVar() { globalThis.someGlobalVar = 100; } // Good - 按需调用 export function initializeAppStorage() { AppStorage.setOrCreate("SomeAppStorageVar", 200); } ``` ## 并发最佳实践 ### 任务选择指南 | 场景 | 推荐方案 | |------|----------| | CPU密集型短期任务 | TaskPool | | I/O密集型操作 | async/await | | 长期后台任务 | Worker | | 独立并行任务 | TaskGroup | | 跨线程共享状态 | Sendable + 容器 | | 有序任务执行 | TaskPool + 优先级 | ### 常见模式 **并行数据处理:** ```typescript @Concurrent function processChunk(chunk: collections.Array): number { return chunk.reduce((sum, val) => sum + val, 0); } const chunks = [new collections.Array([1,2,3]), new collections.Array([4,5,6])]; const group = new taskpool.TaskGroup(); chunks.forEach(chunk => { group.addTask(new taskpool.Task(processChunk, chunk)); }); const results = await taskpool.execute(group); const total = results.reduce((sum, val) => sum + val, 0); ``` **Worker消息传递:** ```typescript // 主线程 workerInstance.postMessage({ type: 'fetch', url: '...' }); workerInstance.onmessage = (event) => { if (event.data.type === 'result') { handleResult(event.data.payload); } }; ``` ### 性能考虑 - **TaskPool开销:** 每个任务约1-2ms,批量处理小操作 - **数据传输:** 16MB限制,大缓冲区使用Transferable - **线程数量:** 最大为CPU核数,自动扩缩容 - **优先级:** 后台同步/备份任务使用IDLE - **Sendable:** 复杂对象优先使用Sendable而非序列化 ## 常见问题 | 问题 | 原因 | 解决方案 | |------|------|----------| | 任务未执行 | 缺少`@Concurrent`装饰器 | 添加装饰器 | | 数据损坏 | 参数不可序列化 | 仅使用支持类型 | | 任务超时 | > 3分钟CPU时间 | 拆分为更小任务 | | UI冻结 | 阻塞主线程 | 使用TaskPool处理繁重工作 | | 内存泄漏 | Worker未终止 | 调用`terminate()` | | 数据未更新 | 共享对象非Sendable | 标记为`@Sendable` | | 竞态条件 | 缺少异步锁 | 使用`AsyncLock` | | Promise未捕获 | 缺少catch处理 | 使用errorManager监听unhandled rejection | > 📖 **错误码速查:** [`refs/error-codes.md`](refs/error-codes.md) — 10200001-10200301 错误码含义和修复建议 ## 进一步参考 **📁 本地 API 参考 (refs/ 文件夹):** | 文件 | 内容 | |------|------| | [`refs/taskpool.md`](refs/taskpool.md) | TaskPool 完整 API — Task、TaskGroup、优先级、延时执行 | | [`refs/worker.md`](refs/worker.md) | Worker 完整 API — ThreadWorker、消息通信、生命周期 | | [`refs/collections.md`](refs/collections.md) | 共享容器 API — collections.Array/Map/Set (跨线程传递) | | [`refs/utils.md`](refs/utils.md) | ArkTSUtils API — AsyncLock、ASON、Sendable工具 | | [`refs/buffer.md`](refs/buffer.md) | Buffer API — 二进制数据处理、编码转换 | | [`refs/xml.md`](refs/xml.md) | XML API — XmlSerializer、XmlPullParser | | [`refs/containers.md`](refs/containers.md) | 线性/非线性容器 API — ArrayList、HashMap 等普通容器 | | [`refs/error-codes.md`](refs/error-codes.md) | 错误码速查表 — 10200001-10200301 错误处理 | **官方文档:** - **TaskPool API:** https://docs.openharmony.cn/application-dev/reference/apis-arkui/js-apis-taskpool/ - **Worker API:** https://docs.openharmony.cn/application-dev/reference/apis-arkui/js-apis-worker/ - **容器 API:** https://docs.openharmony.cn/application-dev/reference/apis-arkts/js-apis-util/ - **XML API:** https://docs.openharmony.cn/application-dev/reference/apis-arkts/js-apis-xml/ - **JSON API:** https://docs.openharmony.cn/application-dev/reference/apis-arkts/js-apis-json/ **详细指南:** - **异步并发概述:** `async-concurrency-overview.md` - **TaskPool简介:** `taskpool-introduction.md` - **Worker简介:** `worker-introduction.md` - **Sendable对象:** `arkts-sendable.md` - **共享容器:** `arkts-collections-introduction.md` - **异步锁:** `arkts-async-lock-introduction.md` - **动态导入:** `arkts-dynamic-import.md` - **懒导入:** `arkts-lazy-import.md` - **XML生成:** `xml-generation.md` - **JSON扩展:** `arkts-json.md`