当前位置:网站首页>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()) |
边栏推荐
猜你喜欢
随机推荐
无代码开发平台角色设置入门教程
JMeter使用教程(一)
基于STM32的RFID-RC522门禁系统
ESP8266-Arduino programming example-EEPROM read and write
PyQt5快速开发与实战 7.2 信号与槽再细分 && 7.3 信号与槽的高级玩法
GNOME将在Secure Boot被禁用时向用户发出警告 并准备提供安全帮助
cpolar应用实例之助力航运客户远程办公
【AutoSAR 一 概述】
中天钢铁在 GPS、 AIS 调度中使用 TDengine
[Mathematical Foundation] Learning about concepts related to linear algebra
一道菜撑起百亿估值的太二酸菜鱼,能否迈过食品安全这道坎?
easyExce模板填充生成Excel的实际操作,多sheet页处理
数据可视化----网页显示温湿度
Xcode如何利用预览(Preview)让SwiftUI视图快速适配不同尺寸的设备
scratch 编程 + 小学数学
接口测试工具之Postman详解
LeetCode 1047 Remove all adjacent duplicates in a string
小程序onlaunch和onload(小程序onunload)
ds1302——Bin brother 51
华为云14天鸿蒙设备开发-Day9网络应用开发








