我可以始终使用 WorkManager 而不是协程吗?

can I always use WorkManager instead of coroutines?

我想知道既然 WorkManager 有出色的解决方案,我为什么还要费心使用 rx 或协程。但是对于几乎所有教程,他们都使用协程,所以 WorkManager 可能有缺点吗?

如果您的目标是编写干净的代码,而无需显式构建回调并传递给后台任务,那么您会发现协程是唯一的选择。

使用协同程序绝不排除使用 WorkManager 或您选择的任何其他工具进行后台操作。您可以使协程适应任何提供回调的API,作为继续执行后台操作结果的一种方式。

两者的范围不同。 WorkManager 将安排可延迟(任何以后的时间)或立即安排。 异步任务。

As documentation says

The WorkManager API makes it easy to specify deferrable, asynchronous tasks and when they should run. These APIs let you create a task and hand it off to WorkManager to run immediately or at an appropriate time.

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

还有 在内部,协程和 WorkManager 的工作方式不同。工作管理器严重依赖 Android 系统组件(如服务、警报管理器等)来安排工作,而协程则在工作线程上安排工作,这也是一种不同于 WorkManager (API) 的语言功能。因此可以肯定地说协程不会超出您的应用程序范围。另一方面,WorkManager 甚至可以在您的应用程序未激活时执行给定的任务。例如,后台服务。

正如 Marko 回答的那样,使用协程将由于其基本设计而带来更好的代码可读性和质量。 我还想包括 ANKO,它是一个很棒的库,为 Android.

提供了有用的 API 协程。

有没有其他人回答,WorkManager 解决的问题与 Kotlin 的协程或像 RxJava 这样的响应式库不同。

WorkManager 现已作为测试版提供,并且生成了更多文档,希望能阐明这一点。 其中一份文件是我和一些同事一起写的博客 post:Introducing WorkManager,您可以在其中阅读:

A common confusion about WorkManager is that it’s for tasks that needs to be run in a “background” thread but don’t need to survive process death. This is not the case. There are other solutions for this use case like Kotlin’s coroutines, ThreadPools, or libraries like RxJava. You can find more information about this use case in the guide to background processing.

工作经理:

同时支持异步一次性任务和周期性任务 支持网络条件、存储space、充电状态等约束 复杂工作请​​求的链接,包括 运行ning 并行工作 一个工作请求的输出用作下一个工作请求的输入 将 API 级别兼容性处理回 API 级别 14(见注释) 使用或不使用 Google 播放服务 遵循系统健康最佳实践 LiveData 支持以 UI 轻松显示工作请求状态 等待适当的时间 运行.

协程:

简洁的代码,以不同的方式在引擎盖下工作。 运行马上。

所以根据您的要求选择更好的选项。

后台任务属于以下主要类别之一:

  1. 立即
  2. 延期
  3. 完全

要对任务进行分类,请回答以下问题:

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

If so, this task should be categorized for immediate execution. If not, proceed to the second question.

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

If you do need to run a task at an exact time, categorize the task as exact.

大多数任务不需要 运行 在准确的时间。任务通常允许根据网络可用性和剩余电池等条件 运行 略有变化。不需要在确切时间 运行 的任务应归类为延迟。

当任务需要立即执行并且任务将在用户离开特定范围或完成交互时结束时使用 Kotlin Coroutine

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

当任务需要在准确的时间点执行时使用AlarmManager

有关详细信息,请访问此 link

来自official Documentation:

It is important to note that coroutines is a concurrency framework, whereas WorkManager is a library for persistent work.