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()即使它失败了,这似乎是错误的。
即使先前的调用之一失败,如何才能顺序执行操作?
正如您所写,当您构建 时WorkCountination,如果其中一个工作程序失败,则所有链都将被标记为失败,并且后续工作程序不会被执行。
当您使用带有;的独特工作请求时也是如此。在这种情况下,您还构建了一个工作链,因此,如果其中一个工作程序失败,则所有后续工作程序都不会执行。APPEND ExistingWorkPolicy
如果你想要有一个有保证的订单,并且你不介意以前的工人是否失败我只能想到两个解决方案:
Result.Success(dataOut)从你的工人那里回来。您定义什么是成功,对于 WorkManager 来说,链中的失败意味着链中的所有内容都需要失败。这不是您想要的,因此您可以在dataOut对象中添加一些附加信息。就我个人而言,我更喜欢第一个选项,您只需要与 WorkManager 就成功和失败达成一致,并Result.Success()在需要处理“不成功”情况时使用您在调用中返回的 Data 对象。
| 归档时间: |
|
| 查看次数: |
722 次 |
| 最近记录: |