Android 如何在没有工作连续性的情况下将顺序工作排队
使用WorkManager 2.1.0 如何在不使用WorkContinuation的情况下将一组操作排队?如果我有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
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)