HarmonyOS鸿蒙Next中workinfo参数问题
HarmonyOS鸿蒙Next中workinfo参数问题
const workInfo: workScheduler.WorkInfo = {
workId: 1001,
bundleName: 'com.example.weatherapp',
abilityName: 'WarningCheckTask',
// 任务重复的最小间隔为 2小时
repeatCycleTime: 3600 * 1000 * 2,
isRepeat: true,
// 需要有网络
networkType: workScheduler.NetworkType.NETWORK_TYPE_ANY,
// 设备重启后,调度依然有效
isPersisted: true,
parameters:{
mykey0: 1,
mykey1: "string value",
mykey2: true,
mykey3: 1.5
}
};
为什么我这个workinfo在stopwork的时候老是会报错401,说参数不符合string,boolean和number,这是什么原因,我之前没有配置parameter这个属性也会这样,我按照官方文档加上参数配置也会出错,是什么原因啊E Error: BussinessError 401: Parameter error. The type of parameters must be string, boolean or number.
更多关于HarmonyOS鸿蒙Next中workinfo参数问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
楼主您好,这边通过测试发现并没有相关报错,示例代码如下
aboutToAppear(): void {
const workInfo: workScheduler.WorkInfo = {
workId: 1001,
bundleName: 'native.huawei.myapplication', // 真实的项目包名
abilityName: 'WarningCheckTask',
// 任务重复的最小间隔为 2小时
repeatCycleTime: 3600 * 1000 * 2,
isRepeat: true,
// 需要有网络
networkType: workScheduler.NetworkType.NETWORK_TYPE_ANY,
// 设备重启后,调度依然有效
isPersisted: true,
parameters: {
mykey0: 1,
mykey1: "string value",
mykey2: true,
mykey3: 1.5
}
};
try {
workScheduler.stopWork(workInfo);
console.info('workschedulerLog startWork success');
} catch (error) {
console.error(`workschedulerLog startwork failed. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`);
}
}
为了更快解决您的问题,麻烦请补充以下信息: 复现代码(如最小复现demo): 版本信息(如:开发工具、手机系统版本信息):
更多关于HarmonyOS鸿蒙Next中workinfo参数问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
parameters: {
mykey0: 1,
mykey1: "string value",
mykey2: true,
mykey3: "1.5" // 改为字符串传递
}
一切正常
aboutToAppear(): void {
const workInfo: workScheduler.WorkInfo = {
workId: 1001,
bundleName: 'com.example.myapplication', // 真实的项目包名
abilityName: 'EntryAbility',
// 任务重复的最小间隔为 2小时
repeatCycleTime: 3600 * 1000 * 2,
isRepeat: true,
// 需要有网络
networkType: workScheduler.NetworkType.NETWORK_TYPE_ANY,
// 设备重启后,调度依然有效
isPersisted: true,
parameters: {
mykey0: 1,
mykey1: "string value",
mykey2: true,
mykey3: 1.5
}
};
try {
workScheduler.startWork(workInfo);
workScheduler.stopWork(workInfo);
console.info('workschedulerLog startWork success');
} catch (error) {
console.error(`workschedulerLog startwork failed. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`);
}
}
在HarmonyOS Next中,WorkInfo是任务管理模块的关键参数,用于定义后台任务的执行信息。它包含任务ID、执行状态、进度等核心属性,开发者通过WorkInfo配置任务的约束条件、重试策略和结果回调。任务执行状态通过枚举值表示,如运行中、成功或失败。WorkInfo对象在任务创建时初始化,系统根据其参数调度和管理任务生命周期。
根据你提供的代码和错误信息,问题很可能出在 parameters 对象中。HarmonyOS Next 的 workScheduler.WorkInfo 对 parameters 字段的值有严格的类型限制,只允许 string、boolean 或 number 这三种基础类型。
从你的代码看,mykey0: 1 和 mykey3: 1.5 都是有效的 number 类型,mykey1: "string value" 是有效的 string 类型,mykey2: true 是有效的 boolean 类型。理论上这个配置本身是符合要求的。
导致 stopWork 时报 401 参数错误,通常有以下几种可能:
-
参数值存在隐式的不合规类型:这是最常见的原因。请确保
parameters对象中 没有任何一个值 是null、undefined、Array、Object、Function或Symbol。即使是嵌套在对象或数组中的这些类型也会导致校验失败。你的代码中直接赋值了字面量,所以这个可能性较小。 -
WorkInfo 对象在创建后被意外修改:在调用
startWork之后,如果你的代码逻辑在某个地方修改了最初用于启动任务的workInfo对象(特别是parameters),使其包含了非法类型,那么当你使用这个被修改后的对象(或一个结构类似但包含了非法值的对象)去调用stopWork时,系统会校验失败。 -
stopWork传入的 workInfo 对象与startWork时的不一致:stopWork方法需要你传入一个WorkInfo对象来标识要停止的任务。这个对象必须与startWork时使用的对象在关键字段上匹配(如workId,bundleName,abilityName)。如果stopWork时传入的workInfo对象里parameters的结构或类型与启动时不同,即使parameters本身合法,也可能因不匹配而导致错误。一个常见的做法是,在调用stopWork时,只提供必要的标识字段(如workId),而省略parameters或其他可选字段,或者确保传入的parameters对象与启动时完全一致。
排查建议:
- 检查
stopWork调用:首先,仔细检查你调用stopWork时传入的workInfo对象。最安全的做法是,停止任务时,构造一个新的、干净的WorkInfo对象,只设置workId、bundleName、abilityName这三个用于唯一标识任务的必要字段,不要设置parameters字段,或者将其设置为一个空对象{}。const stopInfo: workScheduler.WorkInfo = { workId: 1001, bundleName: 'com.example.weatherapp', abilityName: 'WarningCheckTask' // 不传递 parameters }; workScheduler.stopWork(stopInfo); - 审视整个数据流:检查从
startWork到stopWork之间,你的workInfo对象实例是否被任何代码(包括异步回调、函数参数传递等)修改过。 - 使用深拷贝:在调用
startWork前,可以考虑对workInfo对象进行一次深拷贝,使用这个拷贝后的对象去启动任务,并保存好这个原始拷贝。在需要stopWork时,使用这个保存好的原始拷贝对象。
错误码 401 明确指出了类型问题,焦点应放在确保传递给 workScheduler API 的整个 WorkInfo 对象(尤其是 parameters)在任何时候都完全遵守类型规范。

