当前位置:网站首页>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()) |
边栏推荐
- [数学基础]高等数学相关概念学习
- 【目标检测】Generalized Focal Loss V2
- etcd实现大规模服务治理应用实战
- Detailed explanation of design ideas of webUI test framework
- Is it safe to use the MD5 encrypted string to store the password?Hash algorithm you have to know
- MySQL 中的反斜杠 \\,怎么能这么坑?
- 接口测试工具之Postman详解
- C language learning books zero-based introductory articles
- cv2 imread()函数[通俗易懂]
- C语言进阶 —— 枚举与联合
猜你喜欢
Flink1.15源码阅读flink-clients之GenericCLI、flinkYarnSessionCLI和DefaultCLI
要卖课、要带货,知识付费系统帮你一步搞定!
C language learning books (improvement)
笛卡尔树(暑假每日一题 9)
[数学基础]线性代数相关概念学习
cpolar应用实例之助力航运客户远程办公
Safe Browser will have these hidden features that will let you play around with your browser
常用电源符号含义分享
MySQL 中的反斜杠 \\,怎么能这么坑?
【Autosar vLinkGen 链接器脚本生成器】
随机推荐
安全浏览器将拥有这些隐藏功能,让你玩转浏览器
ESP8266-Arduino programming example-LittleFS and data upload
LeetCode #88.合并两个有序数组
Gesture password unlock WeChat applet project source code
etcd implements large-scale service governance application combat
[Binary tree] The number of good leaf node pairs
【AutoSAR 十一 通信相关机制】
[数学基础]线性代数相关概念学习
[数学]考研数学公式定理大总结
ACM study book introduction
ds1302——斌哥51
小程序onlaunch和onload(小程序onunload)
虚假新闻检测论文阅读(六):A Deep Learning Model for Early Detection of Fake News on Social Media
JMeter usage tutorial (2)
Monitoring basic resources through observation cloud monitor, automatic alarm
专家建议|经济低迷周期下如何制订求存的增长战略
mnist有多少张图片(怎么读取图片文字)
Experience Sharing | Tips for Writing Easy-to-Use Online Product Manuals
Agile Organization | The path for enterprises to overcome the impact of the digital wave
Expert advice | How to formulate a growth strategy for survival in an economic downturn