这是一个问题,然后请教如何。
我正在使用viewmodelScope启动作业以与ViewModel中的数据库进行交互。其中一些工作可能需要很长时间,并且在工作进行中,使用可能会偏离活动/片段。
无论如何我都希望工作完成。在这种情况下使用GlobalScope是否可以接受?
答案 0 :(得分:2)
乍看之下,GlobalScope
似乎是实现长时间运行的好选择。但是随后您会遇到 Android 生命周期的问题。
假设您不再受其约束。全局操作完成后,您将在Activity
或Fragment
中取消回调。另外,您也会泄漏这些实例。
相反,您应该考虑在NonCancellable
Job内调用方法:
withContext(NonCancellable) {
...
}
您的代码将在您长时间运行的代码完成并正确清理之后被取消。
如果您的呼叫与 Android 生命周期中的任何事物完全无关,因此不受限制,则只需GlobalScope
。
答案 1 :(得分:0)
引用Kotlin图书馆小组负责人Roman Elizarov的话,他们{@ {3}}:
几乎没有理由在需要以下用途的应用程序中使用GlobalScope 基于Kotlin协程。
如果您要说“无论如何完成工作”,请记住一切都有范围。无论是片段,活动还是应用程序,一切最终都将结束。因此,更好的解决方案是使用on this topic并从与其工作关联的范围中启动数据库作业。
听起来这就是您的情况。但是,如果您的UI无法阻止用户在工作完成之前离开活动,并且始终完成工作至关重要,那么您可能需要的不仅仅是协程。考虑改用structured concurrency安排您的长期工作。
无论哪种方式,请尝试避免使用GlobalScope
,因为它不是正确的解决方案。