android - 如何在没有 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()
即使它失败了,这似乎是错误的。
即使先前的调用之一失败,如何按顺序执行操作?
解决方案
正如您所写,当您构建一个时WorkCountination
,如果其中一个工作人员失败,则所有链都被标记为失败,并且不会执行以下工作人员。
当您将独特的工作请求与;一起使用时也是如此。在这种情况下,您还构建了一个工作链,因此,如果其中一个工作人员失败,则不会执行以下所有工作人员。APPEND
ExistingWorkPolicy
我想有一个有保证的订单,如果以前的工人失败了你不介意我只能想到两个解决方案:
- 总是
Result.Success(dataOut)
从你的工人那里回来。您定义什么是成功,对于 WorkManager,链中的失败意味着链中的所有内容都需要失败。这不是您想要的,因此您可以在dataOut
对象中添加一些附加信息。 - 您从第一个工作人员中将第二个工作人员排入队列,与结果无关。
我个人更喜欢第一个选项,您只需要就 WorkManager 的成功和失败达成一致,Result.Success()
如果您需要处理“不成功”的情况,请使用您在调用中返回的 Data 对象。
推荐阅读
- python - 乒乓球拍有一些奇怪的错误阻止玩家得分
- git - 拉取请求是“Git 功能”还是 GitHub 功能?
- css - 以角度动态更改css变量
- visual-studio - Office/Sharepoint 开发人员工具不会显示在 Visual Studio 中(尽管已安装)
- python - 我如何从 Ajax 为 django 获取 id 文章
- azure - Azure WebApp 作为容器支持的应用程序类型
- flutter - 覆盖颤动的文本主题
- javascript - 从服务器返回的数组,但即使在将其序列化为 json 之后,它也不会转换为数组
- python - `为什么 Visual Studio Code 无法识别已安装的 Python 模块?
- javascript - 如何在 JavaScript 猜数字游戏中跟踪尝试