如何在没有 WorkContinuation 的情况下对顺序工作进行排队

Pzt*_*tar 2 android android-workmanager kotlin-coroutines

使用WorkManager 2.1.0,

如何在不使用 WorkContinuation 的情况下对一组操作进行排队?如果我有

val firstSet = firstWorkers()
val secondSet = secondWorkers()
Run Code Online (Sandbox Code Playgroud)

完成secondSet后如何执行?firstSet

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


我尝试过的事情,

排队

workManager.enqueue(firstSet)
workManager.enqueue(secondSet)
Run Code Online (Sandbox Code Playgroud)

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

实时数据

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

异步/等待

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

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


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

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

pfm*_*ggi 5

正如您所写,当您构建 时WorkCountination,如果其中一个工作程序失败,则所有链都将被标记为失败,并且后续工作程序不会被执行。

当您使用带有;的独特工作请求时也是如此。在这种情况下,您还构建了一个工作链,因此,如果其中一个工作程序失败,则所有后续工作程序都不会执行。APPEND ExistingWorkPolicy

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

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

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