Android Kotlin协同程序:使用全局范围是一种反模式吗?
这是一个如何建议的问题 我正在使用viewmodelScope启动作业,以便与ViewModel中的数据库进行交互。其中一些作业可能需要很长时间,在作业进行时,use可能会离开活动/片段Android Kotlin协同程序:使用全局范围是一种反模式吗?,android,kotlin,android-viewmodel,kotlin-coroutines,Android,Kotlin,Android Viewmodel,Kotlin Coroutines,这是一个如何建议的问题 我正在使用viewmodelScope启动作业,以便与ViewModel中的数据库进行交互。其中一些作业可能需要很长时间,在作业进行时,use可能会离开活动/片段 不管发生什么事,我都想完成这项工作。在这种情况下使用GlobalScope是否可以接受 乍一看GlobalScope似乎是实现长时间运行操作的好选择。但是你会遇到Android生命周期的问题 假设你不再受约束了。全局操作完成后,您将在活动或片段中取消挂起回调。此外,您还将泄漏这些实例 相反,你应该在A以内调用你
不管发生什么事,我都想完成这项工作。在这种情况下使用GlobalScope是否可以接受 乍一看
GlobalScope
似乎是实现长时间运行操作的好选择。但是你会遇到Android生命周期的问题
假设你不再受约束了。全局操作完成后,您将在活动
或片段
中取消挂起回调。此外,您还将泄漏这些实例
相反,你应该在A以内调用你的方法:
在长时间运行的代码完成并正确清理之后,您的代码将被取消
如果您的呼叫与Android生命周期中的任何内容都完全无关,因此不受限制,请引用Kotlin libraries团队负责人、协同程序的Roman Elizarov的话,选择GlobalScope
:
几乎没有理由在这样的应用程序中使用GlobalScope
基于Kotlin协同程序
如你所说,如果你想“无论如何都要完成工作”,请记住每件事都有一个范围。无论是片段、活动还是应用程序,最终一切都会结束。因此,更好的解决方案是从与其工作相关联的范围中使用并启动数据库作业
听起来你的情况就是这样。但是,如果您的UI无法阻止用户在工作完成之前离开活动,并且工作始终完成是至关重要的,那么您可能需要的不仅仅是协同路由。考虑将您的长时间运行的工作安排为,
无论哪种方式,尽量避免使用GlobalScope,因为它不是正确的解决方案。谢谢,你能详细说明一下“Android生命周期”吗?你是指应用程序生命周期还是活动生命周期?我的调用未绑定到活动生命周期,因为它们是数据库调用。活动
或片段
的生命周期。关于约束,问题是,您是否在全局范围内的协同程序中使用任何绑定到生命周期范围内的挂起函数。如果您想测试<代码>全局代码> /Calp> D工作片,必须事先注意一点。对于与您没有直接连接的作业,您可以考虑<代码> WorkMasks/Cuff>。activity/fragment.谢谢,我已经在为长时间运行的批处理作业使用WorkManager了。看起来最好使用活动范围。我不时看到WorkManager
是专门为可延迟的作业/任务设计的。在这种情况下,WorkManager
可能并不比GlobalScope
更理想。
withContext(NonCancellable) {
...
}