Android Kotlin协程:使用Global范围是否是反模式?

时间:2019-05-24 09:01:19

标签: android kotlin android-viewmodel kotlin-coroutines

这是一个问题,然后请教如何。

我正在使用viewmodelScope启动作业以与ViewModel中的数据库进行交互。其中一些工作可能需要很长时间,并且在工作进行中,使用可能会偏离活动/片段。

无论如何我都希望工作完成。在这种情况下使用GlobalScope是否可以接受?

2 个答案:

答案 0 :(得分:2)

乍看之下,GlobalScope似乎是实现长时间运行的好选择。但是随后您会遇到 Android 生命周期的问题。

假设您不再受其约束。全局操作完成后,您将在ActivityFragment中取消回调。另外,您也会泄漏这些实例。

相反,您应该考虑在NonCancellable Job内调用方法:

withContext(NonCancellable) {
    ...
} 

您的代码将在您长时间运行的代码完成并正确清理之后被取消。

如果您的呼叫与 Android 生命周期中的任何事物完全无关,因此不受限制,则只需GlobalScope

答案 1 :(得分:0)

引用Kotlin图书馆小组负责人Roman Elizarov的话,他们{@ {3}}:

  

几乎没有理由在需要以下用途的应用程序中使用GlobalScope   基于Kotlin协程。

如果您要说“无论如何完成工作”,请记住一切都有范围。无论是片段,活动还是应用程序,一切最终都将结束。因此,更好的解决方案是使用on this topic并从与其工作关联的范围中启动数据库作业。

听起来这就是您的情况。但是,如果您的UI无法阻止用户在工作完成之前离开活动,并且始终完成工作至关重要,那么您可能需要的不仅仅是协程。考虑改用structured concurrency安排您的长期工作。

无论哪种方式,请尝试避免使用GlobalScope,因为它不是正确的解决方案。