当前位置:网站首页>Kotlin - 协程作用域 CoroutineScope、协程构建器 CoroutineBuilder、协程作用域函数 CoroutineScope Functiom
Kotlin - 协程作用域 CoroutineScope、协程构建器 CoroutineBuilder、协程作用域函数 CoroutineScope Functiom
2022-07-29 19:44:00 【懒到死的程序员】
协程作用域 CoroutineScope
是一个接口。用来追踪内部启动的协程,并对它们进行有组织的统一管理(结构化并发),因此不能在协程作用域外启动协程。
例如当 Activity 销毁后,协程还在执行,此时会造成资源浪费(内存、CPU、磁盘、无用网络请求)。协程作用域被 cancel() 取消的话,里面的子协程都会被取消。
协程启动器 CoroutineBuilder
挂起函数需要相互传递 Continuation,每个挂起函数都要由另一个挂起函数调用,这一切都是从协程构建器开始的。每个协程构造器都是CoroutineScope的扩展函数,并继承了它的coutineContext来自动传播其上下文元素和可取消性。
- lunch():无需产生值。返回一个 Job实例 用来管理协程的生命周期。异常???
- async():需要产生值。返回一个 Deferred实例 通过 await() 拿到执行的结果(包括异常)。异常???
参数 context:指定协程上下文。 参数 start:指定协程启动方式,默认为可以立刻被调度的状态。 参数 block:协程执行体,即要做的任务。 | |
| lunch() | public fun CoroutineScope.launch( 返回对该协程任务的引用,即 Job 接口的匿名实现。 |
| async() | public fun <T> CoroutineScope.async( 返回协程的执行结果,通过 await() 可以拿到协程的执行结果。 |
协程作用域函数 CoroutineScope Functiom
| 全局协程作用域 | GlobalScope.class | 实现类,通过它启动的协程可以一直运行到应用停止。不会阻塞其所在线程,启动的协程相当于守护线程,不会阻止JVM结束运行。需要手动管理开启的协程可能会导致内存泄漏慎用,不推荐使用。 |
| 阻塞式协程作用域 | runBlocking() | 会阻塞当前线程直到其内部所有协程执行完毕,内部的协程彼此之间依旧是非阻式,参数二的Lambda接收者为CoroutineScope,因此可以在函数内部启动协程。用于把阻塞式的普通函数内部改为协程式编写,一般用于main函数作测试。单元测试一般使用它的接班人runTest。 |
| 挂起式协程作用域 | coroutineScope() | 子协程抛出异常会取消整个作用域内的协程。 |
| supervisorScope() | 子协程抛出异常不会连锁取消同级子协程或外部父协程。 | |
| MainScope() | public fun MainScope(): CoroutineScope = ContextScope(SupervisorJob() + Dispatchers.Main) 默认使用 SupervisorScope()+Dispatchers.Main 的协程作用域。该调度程序会绑定到主线程(在Android中就是 UI Thread),在 onDestroy() 中调用 cancel() 关闭协程。可用于主动控制协程的生命周期,对Android开发意义在于避免内存泄漏。 | |
| 具有生命周期感知的协程作用域 | ViewModel.viewModelScope | 是 ViewModelKTX 提供的扩展属性,在 Activity/Fragment 中使用,UI 销毁时协程作用域会自动被 cancel,避免造成协程泄漏(内存泄漏)。 |
| LifecycleOwner.lifecycleScope | SupervisorJob() + Dispatchers.Main.immediate。是 LifeCycleKTX 提供的扩展属性,在 ViewModel 销毁时协程作用域会自动被 cancel,避免造成协程泄漏(内存泄漏)。 | |
| CoroutineScope() | public fun CoroutineScope(context: CoroutineContext): CoroutineScope = ContextScope(if (context[Job] != null) context else context + Job()) |
边栏推荐
- 正则表达式
- 专家建议|经济低迷周期下如何制订求存的增长战略
- ESP8266-Arduino programming example-LittleFS and data upload
- 无偏估计和最小方差无偏估计简介
- C language learning books (improvement)
- Chrome - Plugin Recommendations
- ESP8266-Arduino编程实例-I2C设备地址扫描
- Durable rules(持久规则引擎) 学习小记
- Detailed explanation of design ideas of webUI test framework
- LeetCode_474_一和零
猜你喜欢

《帧同步教程一》定点数原理和无损精度的实现方式

PyQt5快速开发与实战 7.2 信号与槽再细分 && 7.3 信号与槽的高级玩法

LeetCode 1047 Remove all adjacent duplicates in a string

4D Summary: 38 Knowledge Points of Distributed Systems
![[GXYCTF2019]禁止套娃](/img/91/3f64bebd13a8b13fbb387c2acf8618.png)
[GXYCTF2019]禁止套娃

通过观测云监控器监控基础资源,自动报警

LeetCode_474_一和零

Safe Browser will have these hidden features that will let you play around with your browser

Agile Organization | The path for enterprises to overcome the impact of the digital wave

Typescript mix method to class with decorator
随机推荐
图床软件要收费,算了我自己写一个开源免费的。
C语言学习书籍 零基础入门篇
Build your own image search system (1): 10 lines of code to search images by image
峰会(暑假每日一题 8)
【AutoSAR 九 C/S原理架构】
Chrome——插件推荐
【Autosar vLinkGen 链接器脚本生成器】
LeetCode_474_一和零
Expert advice | How to formulate a growth strategy for survival in an economic downturn
LeetCode_474_ one and zero
《帧同步教程一》定点数原理和无损精度的实现方式
Web—信息收集(非常全)
正则表达式
简单说说K均值聚类
The ambition of glory: "high-end civilians" in a smart world
JMeter使用教程(二)
树上启发式合并小结
笛卡尔树(暑假每日一题 9)
Typescript mix method to class with decorator
Experience Sharing | Tips for Writing Easy-to-Use Online Product Manuals