Android CoroutineScope 完成后自动取消

     2023-05-07     275

关键词:

【中文标题】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】:

CoroutineScopeCoroutineContext 组成。一个CoroutineContext由2个主要元素组成,一个Job和一个ContinuationInterceptor(通常只是一个CoroutineDispatcher),其他元素是CoroutineExceptionHandlerCoroutineName

如果协程完成,它不会取消作用域(即它的作业)。 即使您取消协程的作业,它也不会取消作用域(即其作业)。因为每次您使用特定范围触发协程时,协程的作业都会成为该范围作业的子作业。

在您的情况下backgroundScope,您自己没有指定Job,如果您深入研究源代码,您会发现在没有Job 的情况下,提供了一个Job 实例。 .

val coroutineJob = backgroundScope.launch  ... 

当这个coroutineJob完成或被取消时,它不会取消backgroundScope内的Job,因此backgroundScope不会被取消。

【讨论】:

【参考方案2】:

它不会自动取消。它对在其上启动的任意数量的工作保持开放。但是,如果您不希望它被任何异常完成的子作业杀死,您可能希望给范围一个 SupervisorJob() 作为其根上下文。如果发生这种情况,作用域上的后续协程将不会启动。

private val backgroundScope = CoroutineScope(SupervisorJob())

lifecycleScopeviewModelScope 在其关联类被销毁时自动取消的原因是,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),所以有必要了解清楚常用的协程作用... 查看详情