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

5 回复

楼主您好,这边通过测试发现并没有相关报错,示例代码如下

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 参数错误,通常有以下几种可能:

  1. 参数值存在隐式的不合规类型:这是最常见的原因。请确保 parameters 对象中 没有任何一个值 是 null、undefined、Array、Object、Function 或 Symbol。即使是嵌套在对象或数组中的这些类型也会导致校验失败。你的代码中直接赋值了字面量,所以这个可能性较小。

  2. WorkInfo 对象在创建后被意外修改:在调用 startWork 之后,如果你的代码逻辑在某个地方修改了最初用于启动任务的 workInfo 对象(特别是 parameters),使其包含了非法类型,那么当你使用这个被修改后的对象(或一个结构类似但包含了非法值的对象)去调用 stopWork 时,系统会校验失败。

  3. 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)在任何时候都完全遵守类型规范。

回到顶部