【问题标题】:can I always use WorkManager instead of coroutines?我可以总是使用 WorkManager 而不是协程吗?
【发布时间】:2018-11-25 02:36:54
【问题描述】:

我想知道当有像 WorkManager 这样出色的解决方案时,我为什么要为 rx 或协程烦恼。但是对于几乎所有教程,他们都使用协程,所以 WorkManager 可能有缺点吗?

【问题讨论】:

  • 协程和WorkManager的存在是为了解决不同的问题。

标签: android android-jetpack kotlinx.coroutines android-workmanager


【解决方案1】:

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

如文档所述

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

另一方面,协程被设计为仅立即异步计算给定任务。

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

正如 Marko 所回答的,由于其基本设计,使用协程将导致更好的代码可读性和质量。 我还想包括ANKO,它是一个很棒的库,它为 Android 的协程提供了有用的 API。

【讨论】:

  • 所以当我将这两者结合起来时,它应该会很好地工作,对吗?因为我获得了协程的可读性和 WorkManager 的后台执行?
  • 在我看来,作为开发人员,您应该选择平台原生方式来完成任务,充分利用平台为您提供的最大 API,因为所有 API 都被 Android 开发人员紧密对齐。它通常会增加学习曲线,许多开发人员更喜欢使用已经熟悉的乐器
【解决方案2】:

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

  1. 立即
  2. 延期
  3. 准确

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

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

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

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

如果您确实需要在准确的时间运行任务,请将任务分类为 准确的。

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

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

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

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

更多详情,请访问link

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      工作经理:

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

      协程:

      干净的代码,在后台以不同的方式工作。立即运行。

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

      【讨论】:

      • 复制粘贴文档并没有那么有用。也许提供您的输入,然后将其链接为参考 :) -- 您永远不知道此文档何时更改并且此通用文本已过时
      【解决方案5】:

      有其他人回答说,WorkManager 解决的问题与 Kotlin 的 corountines 或 RxJava 之类的响应式库不同。

      WorkManager 现在以测试版的形式提供,并且生成了其他文档,希望能够清楚地说明这一点。 其中一份文件是我与一些同事写的博客文章:Introducing WorkManager,您可以在其中阅读:

      关于 WorkManager 的一个常见混淆是,它用于需要在“后台”线程中运行但不需要在进程死亡后幸存下来的任务。不是这种情况。对于这个用例还有其他解决方案,例如 Kotlin 的协程、ThreadPools 或 RxJava 等库。您可以在guide to background processing 中找到有关此用例的更多信息。

      【讨论】:

        猜你喜欢
        • 2012-10-24
        • 1970-01-01
        • 2017-06-18
        • 2020-04-11
        • 1970-01-01
        • 2013-01-08
        • 1970-01-01
        • 2017-06-10
        • 2021-04-18
        相关资源
        最近更新 更多