You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android Worker执行序列中让后续Worker检测到前置Worker失败

Android WorkManager 串行工作链后置节点检测前置失败的方案

默认串行工作链逻辑:只要Worker_A或Worker_B返回Result.failure(),整个工作链会立即被标记为失败,Worker_C不会被调度执行,因此默认配置下无法直接在Worker_C中检测前置节点的失败状态。

如果需要实现Worker_C无论前置节点成败都能执行、且可检测前置失败状态,可以采用以下两种方案:

方案1:自定义错误状态传递,不直接返回Result.failure()

这是最常用的适配方案,改造逻辑如下:

  • 改造Worker_A、Worker_B的返回逻辑:业务执行出错时不要直接返回Result.failure(),而是返回Result.success(),同时在输出的Data中插入自定义错误标识字段,比如错误码、是否执行成功的布尔值等。
  • 串行工作链的参数会自动向下传递,Worker_C可以直接从inputData中拿到Worker_B的输出参数,也可以通过WorkManager的查询API拿到Worker_A的执行信息及输出参数,从而判断前置节点是否执行失败。
  • 示例代码:
// Worker_A 错误返回示例
override fun doWork(): Result {
    val isSuccess = 执行业务逻辑()
    return if (isSuccess) {
        Result.success(workDataOf("is_a_success" to true))
    } else {
        // 出错时不返回failure,而是把错误信息存在Data里
        Result.success(workDataOf(
            "is_a_success" to false,
            "a_error_code" to 10001
        ))
    }
}

// Worker_C 检测前置状态示例
override fun doWork(): Result {
    // 直接拿Worker_B传递的参数判断Worker_B的执行状态
    val isBSuccess = inputData.getBoolean("is_b_success", true)
    // 通过唯一工作链名称查询Worker_A的执行信息
    val workInfos = WorkManager.getInstance(applicationContext)
        .getWorkInfosForUniqueWork("你的唯一工作链名称").get()
    val aWorkInfo = workInfos.firstOrNull { it.tags.contains(Worker_A::class.java.name) }
    val isASuccess = aWorkInfo?.outputData?.getBoolean("is_a_success", true) ?: true
    
    // 后续业务逻辑
    return Result.success()
}

方案2:监听工作链状态,失败时手动触发Worker_C

如果你的业务逻辑要求Worker_A/Worker_B出错时必须返回Result.failure(),可以给整个唯一工作链设置状态监听:

  • 监听工作链的执行状态,当检测到工作链变为FAILED状态时,手动调用enqueue方法启动Worker_C,同时把失败的Worker信息、错误原因等封装成Data传给Worker_C即可。
  • 你使用的2.6.0-alpha01版本支持响应式API,可以直接用getWorkInfosForUniqueWorkFlow监听状态变化,无需轮询。

内容的提问来源于stack exchange,提问作者Hector

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:09:01