首页 > 解决方案 > 如何在没有 WorkContinuation 的情况下将顺序工作排入队列

问题描述

使用 WorkManager 2.1.0,

如何在不使用 WorkContinuation 的情况下将一组操作排入队列?如果我有

val firstSet = firstWorkers()
val secondSet = secondWorkers()

secondSet完成后如何执行firstSet

不想secondSet链接工作,因为即使调用失败,我仍然希望执行firstSet


我尝试过的事情,

排队

workManager.enqueue(firstSet)
workManager.enqueue(secondSet)

我会假设该enqueue函数会导致操作按顺序运行,但是它们会乱序运行我假设这是由于多线程造成的?

实时数据

workManager.enqueue().state().observe {}workManager.enqueue(secondSet)在一个之后运行SUCCESS

异步/等待

coroutineScope.async { workManager.enqueue().await() }

即使结果是按顺序返回的,网络调用仍然无序发生,在某些情况下firstSet直到最后才会执行。


我能找到的唯一“解决方案”Result.success()是从函数中返回 a ,doWork()即使它失败了,这似乎是错误的。

即使先前的调用之一失败,如何按顺序执行操作?

标签: androidandroid-workmanagerkotlin-coroutines

解决方案


正如您所写,当您构建一个时WorkCountination,如果其中一个工作人员失败,则所有链都被标记为失败,并且不会执行以下工作人员。

当您将独特的工作请求与;一起使用时也是如此。在这种情况下,您还构建了一个工作链,因此,如果其中一个工作人员失败,则不会执行以下所有工作人员。APPEND ExistingWorkPolicy

我想有一个有保证的订单,如果以前的工人失败了你不介意我只能想到两个解决方案:

  1. 总是Result.Success(dataOut)从你的工人那里回来。您定义什么是成功,对于 WorkManager,链中的失败意味着链中的所有内容都需要失败。这不是您想要的,因此您可以在dataOut对象中添加一些附加信息。
  2. 您从第一个工作人员中将第二个工作人员排入队列,与结果无关。

我个人更喜欢第一个选项,您只需要就 WorkManager 的成功和失败达成一致,Result.Success()如果您需要处理“不成功”的情况,请使用您在调用中返回的 Data 对象。


推荐阅读