如何在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
相关产品推荐
相关产品推荐

