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.WorkInfoparameters 字段的值有严格的类型限制,只允许 string、boolean 或 number 这三种基础类型。

从你的代码看,mykey0: 1mykey3: 1.5 都是有效的 number 类型,mykey1: "string value" 是有效的 string 类型,mykey2: true 是有效的 boolean 类型。理论上这个配置本身是符合要求的。

导致 stopWork 时报 401 参数错误,通常有以下几种可能:

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

  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 对象,只设置 workIdbundleNameabilityName 这三个用于唯一标识任务的必要字段,不要设置 parameters 字段,或者将其设置为一个空对象 {}
    const stopInfo: workScheduler.WorkInfo = {
      workId: 1001,
      bundleName: 'com.example.weatherapp',
      abilityName: 'WarningCheckTask'
      // 不传递 parameters
    };
    workScheduler.stopWork(stopInfo);
    
  • 审视整个数据流:检查从 startWorkstopWork 之间,你的 workInfo 对象实例是否被任何代码(包括异步回调、函数参数传递等)修改过。
  • 使用深拷贝:在调用 startWork 前,可以考虑对 workInfo 对象进行一次深拷贝,使用这个拷贝后的对象去启动任务,并保存好这个原始拷贝。在需要 stopWork 时,使用这个保存好的原始拷贝对象。

错误码 401 明确指出了类型问题,焦点应放在确保传递给 workScheduler API 的整个 WorkInfo 对象(尤其是 parameters)在任何时候都完全遵守类型规范。

回到顶部