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

时间:2018-11-25 02:36:54

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

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

5 个答案:

答案 0 :(得分:3)

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

  

如文档所述

     

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

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

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

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

答案 1 :(得分:2)

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

绝不使用协程来将WorkManager或任何其他工具用于您选择的后台操作。您可以使协程适应提供回调的任何API,以此作为继续执行后台操作结果的方法。

答案 2 :(得分:1)

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

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

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

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

<块引用>

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

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

<块引用>

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

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

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

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

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

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

答案 3 :(得分:0)

还有其他人回答,WorkManager解决了与Kotlin的合作伙伴或RxJava之类的反应式库不同的问题。

WorkManager现在可以作为Beta来使用,并且产生了其他文档,希望可以使这一点变得清楚。 这些文档之一是我与一些同事共同撰写的博客文章:Introducing WorkManager,您可以在其中阅读:

  

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

答案 4 :(得分:0)

何时使用WorkManager 即使用户离开特定屏幕或您的应用程序,WorkManager库对于完成有用的任务也是不错的选择。

一些可以很好地使用WorkManager的任务示例:

上传日志

对图像应用过滤器并保存图像

定期将本地数据与网络同步

WorkManager提供有保证的执行,但并非所有任务都需要执行。因此,这不是将所有任务从主线程中运行掉的万能方法。有关何时使用WorkManager的更多详细信息,请查阅《后台处理指南》。

WorkManager是Android Jetpack的一部分,并且是后台工作的体系结构组件,需要兼顾机会和有保证的执行力。机会性执行意味着WorkManager将尽快进行后台工作。有保证的执行意味着即使在离开应用程序的情况下,WorkManager也会照顾逻辑以在各种情况下开始工作。

WorkManager是一个简单但非常灵活的库,它具有许多其他优点。这些包括:

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