Android 如何在没有工作连续性的情况下将顺序工作排队

Android 如何在没有工作连续性的情况下将顺序工作排队,android,android-workmanager,kotlin-coroutines,Android,Android Workmanager,Kotlin Coroutines,使用WorkManager 2.1.0 如何在不使用WorkContinuation的情况下将一组操作排队?如果我有 val firstSet = firstWorkers() val secondSet = secondWorkers() 在firstSet完成后,如何执行secondSet 我不希望链接工作,因为我仍然希望执行第二集,即使在第一集中调用失败 我试过的东西 排队 我假设enqueue函数会导致操作按顺序运行,但是它们的运行顺序不正确我假设这是由于多线程造成的 实时数据 wo

使用WorkManager 2.1.0

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

val firstSet = firstWorkers()
val secondSet = secondWorkers()
firstSet
完成后,如何执行
secondSet

希望链接工作,因为我仍然希望执行
第二集
,即使在
第一集
中调用失败


我试过的东西

排队

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

实时数据

workManager.enqueue().state()。观察{}
并在
成功后运行
workManager.enqueue(secondSet)

异步/等待

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

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


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


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

如您所述,当您构建
工作计数时,如果其中一个工作进程失败,则所有链都标记为失败,并且不会执行以下工作进程

当您将唯一工作请求与现有工作策略一起使用时,也是如此;在本例中,您还构建了一个工作链,因此,如果其中一个工作进程失败,则不会执行以下所有工作进程

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

  • 始终从您的工作人员处返回
    Result.Success(dataOut)
    。您定义了什么是成功,对于WorkManager来说,链中的失败意味着链中的一切都需要失败。这不是您想要的,因此您可以在
    dataOut
    对象中添加一些附加信息
  • 您可以从第一个工作进程内部将第二个工作进程排队,这与它的结果无关

  • 就我个人而言,我更喜欢第一种选择,您只需要与WorkManager就什么是成功与失败达成一致,并使用您在
    结果中返回的数据对象。如果您需要处理“不成功”的情况,success()
    调用。

    如您所述,当您构建
    工作计数时,如果其中一个工作人员失败,所有链都标记为失败,并且未执行以下工作进程

    当您将唯一工作请求与现有工作策略一起使用时,也是如此;在本例中,您还构建了一个工作链,因此,如果其中一个工作进程失败,则不会执行以下所有工作进程

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

  • 始终从您的工作人员处返回
    Result.Success(dataOut)
    。您定义了什么是成功,对于WorkManager来说,链中的失败意味着链中的一切都需要失败。这不是您想要的,因此您可以在
    dataOut
    对象中添加一些附加信息
  • 您可以从第一个工作进程内部将第二个工作进程排队,这与它的结果无关

  • 就我个人而言,我更喜欢第一个选项,您只需要与WorkManager就什么是成功与失败达成一致,如果需要处理“不成功”案例,请使用您在
    结果中返回的数据对象。success()
    调用。

    我认为第一个选项是实现这一点的唯一真正方法,感谢您的确认。您知道是否有任何计划允许链在前一个工作人员失败的情况下继续,或者至少在不继续的情况下按顺序排队操作?这是团队已经看到并正在跟踪的请求。如果您有其他用例,或者您只是想添加对此更改的支持,您可以使用此问题:我认为第一个选项是实现此目标的唯一真正方法,谢谢您的确认。您知道是否有任何计划允许链在前一个工作人员失败的情况下继续,或者至少在不继续的情况下按顺序排队操作?这是团队已经看到并正在跟踪的请求。如果您有其他用例,或者您只想添加对此更改的支持,您可以使用此问题:
    workManager.enqueue(firstSet)
    workManager.enqueue(secondSet)