这两者有什么区别?
我在跟随教程时,老师说我们需要一个随着应用程序一起存在的作用域,用SupervisorJob手动创建作用域。但是GlobalScope不是也可以做同样的事情吗?
我研究了一下,但找不到合适的解释。谢谢。
我在跟随教程时,老师说我们需要一个随着应用程序一起存在的作用域,用SupervisorJob手动创建作用域。但是GlobalScope不是也可以做同样的事情吗?
我研究了一下,但找不到合适的解释。谢谢。
CoroutineScope()
构造函数创建的CoroutineScope上调用cancel()
时,它的所有子协程都将被取消。cancel()
,它将抛出IllegalStateException异常,因为它没有Job来作为其启动的协程的父级。CoroutineScope()
而不传递Job时,它会自动获取一个通用Job作为其协程的父级。像这样的通用父Job将取消其所有子协程,如果其中任何一个失败。如果您明确使用SupervisorJob()
,则如果其中任何一个子项失败,则不会导致取消所有兄弟协程。这是一种类似于GlobalScope的行为,因为GlobalScope协程没有兄弟姐妹,它们可以通过共享的父级导致被取消。@DelicateCoroutinesApi
的原因是许多人误用了GlobalScope。(可能是因为他们在如何使用协程的初学者文档中不幸地使用了它。)使用CoroutineScope(SupervisorJob())
或CoroutineScope(Dispatchers.IO)
等而不是GlobalScope来绕过警告是不正确的,因为这只是掩盖了警告,而不改变行为,除了创建一个多余的CoroutineScope。如果您有一个合法的GlobalScope用例,请使用@OptIn(DelicateCoroutinesApi::class)
来消除警告。
SupervisorJob
的作用是,如果其中一个子协程
失败,其他协程不会受到影响。如果没有SupervisorJob
,则如果一个子协程失败,则所有协程都将被终止。 - Darshan