关键词:
【中文标题】Android CoroutineScope 完成后自动取消【英文标题】:Android CoroutineScope Auto Cancel after It Finishes 【发布时间】:2021-10-18 13:51:49 【问题描述】:我想知道coroutineScope
工作完成后是否会自动取消。假设我在自定义类中创建了一个coroutineScope
而不是ViewModel
类或Fragment / Activity
类:
class MyClass
private val backgroundScope = CoroutineScope(Dispatchers.Default)
fun doSomething() = backgroundScope.launch
//do background work
在这种情况下,后台工作完成后,backgroundScope
会自动取消吗?
【问题讨论】:
【参考方案1】:CoroutineScope
由 CoroutineContext
组成。一个CoroutineContext
由2个主要元素组成,一个Job
和一个ContinuationInterceptor
(通常只是一个CoroutineDispatcher
),其他元素是CoroutineExceptionHandler
和CoroutineName
。
如果协程完成,它不会取消作用域(即它的作业)。 即使您取消协程的作业,它也不会取消作用域(即其作业)。因为每次您使用特定范围触发协程时,协程的作业都会成为该范围作业的子作业。
在您的情况下backgroundScope
,您自己没有指定Job
,如果您深入研究源代码,您会发现在没有Job
的情况下,提供了一个Job
实例。 .
val coroutineJob = backgroundScope.launch ...
当这个coroutineJob
完成或被取消时,它不会取消backgroundScope
内的Job
,因此backgroundScope
不会被取消。
【讨论】:
【参考方案2】:它不会自动取消。它对在其上启动的任意数量的工作保持开放。但是,如果您不希望它被任何异常完成的子作业杀死,您可能希望给范围一个 SupervisorJob()
作为其根上下文。如果发生这种情况,作用域上的后续协程将不会启动。
private val backgroundScope = CoroutineScope(SupervisorJob())
lifecycleScope
和 viewModelScope
在其关联类被销毁时自动取消的原因是,Jetpack 订阅了关联类的生命周期并手动取消了 onDestroy()
中的范围。
【讨论】:
hilt实战|创建应用级别coroutinescope
...践时,您可能需要在某些类中注入应用级别作用域的CoroutineScope,以便可以创建与应用生命周期相同的新协程,或创建在调用者作用域之外仍可以工作的新协程。协程最佳实践https://developer.android.google.cn/kotlin/coroutines/c... 查看详情
hilt实战|创建应用级别coroutinescope
...践时,您可能需要在某些类中注入应用级别作用域的CoroutineScope,以便可以创建与应用生命周期相同的新协程,或创建在调用者作用域之外仍可以工作的新协程。协程最佳实践https://developer.android.google.cn/kotlin/coroutines/c... 查看详情
kotlin协程channel通道③(coroutinescope#produce构造生产者协程|coroutinescope#actor构造消费者协程)
文章目录一、CoroutineScope#produce构造生产者协程1、CoroutineScope#produce函数原型2、代码示例二、CoroutineScope#actor构造消费者协程1、CoroutineScope#actor函数原型2、代码示例一、Coroutin... 查看详情
kotlin协程channel通道③(coroutinescope#produce构造生产者协程|coroutinescope#actor构造消费者协程)(代码片段)
文章目录一、CoroutineScope#produce构造生产者协程1、CoroutineScope#produce函数原型2、代码示例二、CoroutineScope#actor构造消费者协程1、CoroutineScope#actor函数原型2、代码示例一、CoroutineScope#produce构造生产者协程通过CoroutineScope#produce函数,... 查看详情
kotlin协程channel通道③(coroutinescope#produce构造生产者协程|coroutinescope#actor构造消费者协程)(代码片段)
文章目录一、CoroutineScope#produce构造生产者协程1、CoroutineScope#produce函数原型2、代码示例二、CoroutineScope#actor构造消费者协程1、CoroutineScope#actor函数原型2、代码示例一、CoroutineScope#produce构造生产者协程通过CoroutineScope#produce函数,... 查看详情
kotlin协程笔记:coroutinescope管理协程(代码片段)
CoroutineScope是实现协程结构化并发的关键。使用CoroutineScope,可以批量管理同一个作用域下面所有的协程。 CoroutineScope与 结构化并发 launch、async被定义成了CoroutineScope扩展函数。在调用lau... 查看详情
android面试题——kotlin相关面试题(代码片段)
...Blockingget(url)//方法二,自行通过CoroutineContext创建一个CoroutineScope对象,通过launch开启协程valcoroutineScope=CoroutineScope(context)coroutineScope.launchget(url)//方法三,使用GlobalScope单例对象,GlobalScope实际是CoroutineScope的子类,本质... 查看详情
hilt实战|创建应用级别coroutinescope
...佳实践时,您可能需要在某些类中注入应用级别作用域的CoroutineScope,以便可以创建与应用生命周期相同的新协程,或创建在调用者作用域之外仍可以工作的新协程。通过本文,您将学习如何通过Hilt创建应用级别作用域的Coroutine... 查看详情
如何使用匕首解决 ViewModel 中的 coroutineScope 依赖关系
】如何使用匕首解决ViewModel中的coroutineScope依赖关系【英文标题】:HowtoresolvecoroutineScopedependencyinaViewModelusingdagger【发布时间】:2021-11-0303:12:43【问题描述】:我正在尝试将协程作用域注入到viewModel,但我收到daggerkotlinx.coroutines.C... 查看详情
哪个 CoroutineScope 用于 Spring Boot WebFlux 端点
】哪个CoroutineScope用于SpringBootWebFlux端点【英文标题】:WhichCoroutineScopetouseforSpringBootWebFluxendpoint【发布时间】:2019-04-2521:52:40【问题描述】:在SpringBootWebFlux应用程序中,我们有许多端点(REST和GraphQL),它们返回Mono或Flux的东西... 查看详情
Ktor 客户端单元测试在 CoroutineScope.launch() 中挂起/冻结
】Ktor客户端单元测试在CoroutineScope.launch()中挂起/冻结【英文标题】:Ktorclientunittesthangs/freezeswithinCoroutineScope.launch()【发布时间】:2021-12-2409:09:43【问题描述】:我的KMM项目测试在新范围内异步启动的ktor客户端请求时遇到问题。... 查看详情
kotlin协程协程启动⑤(协程作用域构建器|runblocking函数|coroutinescope函数|supervisorscope函数)(代码片段)
...录一、结构化并发二、协程作用域构建器(runBlocking函数|coroutineScope函数)二、协程作用域构建器(coroutineScope函数|supervisorScope函数)1、协程作用域构建器概念2、coroutineScope协程作用域构建器示例3、supervisorScope协程作用域构建器示例... 查看详情
kotlin协程协程启动⑤(协程作用域构建器|runblocking函数|coroutinescope函数|supervisorscope函数)(代码片段)
...录一、结构化并发二、协程作用域构建器(runBlocking函数|coroutineScope函数)二、协程作用域构建器(coroutineScope函数|supervisorScope函数)1、协程作用域构建器概念2、coroutineScope协程作用域构建器示例3、supervisorScope协程作用域构建器示例... 查看详情
Kotlin:在不访问 CoroutineScope 的情况下获取当前的 CoroutineContext.Key?
】Kotlin:在不访问CoroutineScope的情况下获取当前的CoroutineContext.Key?【英文标题】:Kotlin:GetCurrentCoroutineContext.KeywithoutaccesstotheCoroutineScope?【发布时间】:2019-06-1114:41:57【问题描述】:我正在尝试拦截System.out打印语句,并且在多线... 查看详情
深入kotlin-协程上下文job和coroutinescope(代码片段)
协程调试打印协程名首先看这段代码:privatefunlog(msg:String)=println("[$Thread.currentThread().name 查看详情
深入kotlin-协程上下文job和coroutinescope(代码片段)
协程调试打印协程名首先看这段代码:privatefunlog(msg:String)=println("[$Thread.currentThread().name 查看详情
我一次可以观察多少个 Stateflow?
...由IO调度器调度或由Android框架的生命周期组件提供的不同CoroutineScope上完成的。我已经 查看详情
深入理解kotlin协程coroutinescope.launch源码追踪扒皮(代码片段)
lifecycleScope、viewModelScope、GlobalScope、MainScope的上下文协程最重要的就是协程上下文对象,因为通过上下文可以获取到协程相关的任何东西(Job、Dispatcher、Interceptor、Name、ExceptionHandler),所以有必要了解清楚常用的协程作用... 查看详情