我可以始终使用 WorkManager 替代协程吗?

11

我想知道为什么在有如此出色的解决方案WorkManager的情况下,我还需要使用rx或coroutines。但几乎所有的教程都使用coroutines,那么WorkManager是否具有劣势?


协程和WorkManager存在的目的是为了解决不同的问题。 - CommonsWare
6个回答

12

两者的范围是不同的。WorkManager 用于异步调度可延迟(到任何后续时间)或立即执行的任务。

正如文档所述

WorkManager API 可以轻松地指定可延迟、异步任务以及它们应该运行的时间。这些 API 允许您创建一个任务并将其交给 WorkManager 立即或在适当的时间运行。

另一方面,协程旨在计算给定任务,仅限立即和异步。

而且,在内部,协程和 WorkManager 的工作方式不同。WorkManager 严重依赖 Android 系统组件,如服务、闹钟管理器等来安排工作,而协程在 Worker 线程上安排工作,并且是语言特性,不像 WorkManager(API)。因此可以说,协程不会超出您的应用程序。另一方面,WorkManager 甚至可以在您的应用程序不活动时执行给定的任务,例如后台服务。

正如 Marko 所回答的那样,使用协程将导致更好的代码可读性和质量,因为它们的基本设计。我还想包括ANKO,它是一个为 Android 提供围绕协程的有用 API 的优秀库。


那么,当我将这两者结合起来时,它应该能够很好地工作,对吗?因为我可以获得协程的可读性和WorkManager的后台执行功能? - kaulex
在我看来,作为开发者,应该选择平台本地的方式来完成任务,利用平台提供的最大API,因为所有API都由Android开发人员紧密地对齐。这通常会增加学习曲线,许多开发人员更喜欢选择已经熟悉的工具。 - Gleichmut

10

后台任务分为以下几类:

  1. 立即执行
  2. 延迟执行
  3. 精确执行

要将任务分类,请回答以下问题:

任务是否需要在用户与应用程序交互期间完成?

如果是,则应将此任务分类为立即执行。如果不是,则继续回答第二个问题。

任务是否需要在精确时间运行?

如果需要在精确时间运行任务,则将任务分类为精确执行。

大多数任务无需在精确时间运行。任务通常允许根据网络可用性和剩余电量等条件略微变化其执行时间。不需要在精确时间运行的任务应被归类为延迟执行。

当任务需要立即执行并且任务将于用户离开某个范围或完成交互时结束时,请使用Kotlin Coroutine

当任务需要立即执行并且需要持续处理时,即使用户将应用程序置于后台或设备重新启动时,请使用 WorkManager

当任务需要在精确时间点执行时,请使用AlarmManager

有关更多详细信息,请访问此链接


5
如果您的目标是编写干净的代码而不需要显式构造回调来传递给后台任务,则您会发现协程是唯一的选择。
使用协程并不意味着禁止使用WorkManager或任何其他工具进行后台操作。您可以将协程适应于任何提供回调作为继续执行后台操作结果的手段的API。

3

来自 官方文档:

需要注意的是,协程是一个并发框架,而 WorkManager 是一个用于持久化工作的库。


2

WorkManager:

支持异步一次性和定期任务 支持约束条件,例如网络状况、存储空间和充电状态 链接复杂的工作请求,包括并行运行工作 一个工作请求的输出用作下一个工作请求的输入 向后处理API级别兼容性至API级别14(见注释) 与或没有Google Play服务一起使用 遵循系统健康最佳实践 LiveData支持,以便在UI中轻松显示工作请求状态 等待适当的时间运行。

协程:

干净的代码,在底层以不同的方式运行。立即运行。

因此,根据您的需求选择更好的选项。


注释:API级别14对应于Android 4.0(冰淇淋三明治)

4
复制粘贴文档并不是非常有用。也许你可以提出自己的意见,然后将文档作为参考链接 :) -- 你永远不知道什么时候这份文档会发生变化,使得这段通用文字变得过时。 - Joaquim Ley

1

其他人已回复,WorkManager解决的问题与Kotlin的协程或类似RxJava的反应式库不同。

现在,WorkManager作为beta版本可用,并且会生成其他文档,希望这些文档可以让它更加清晰明了。其中之一是我与同事撰写的博客文章:介绍WorkManager,您可以阅读:

关于WorkManager的一个常见误解是,它适用于需要在“后台”线程中运行但不需要在进程死亡时保留的任务。这不是事实。对于这种用例,有其他解决方案,例如Kotlin的协程、ThreadPools或类似RxJava的库。您可以在后台处理指南中找到有关此用例的更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接