简介
介绍
协程是一种并发设计模式,您可以在 Android 平台上使用它来简化异步执行的代码。
简单来说就是执行异步任务。
参考文档
文章目录
Kotlin之协程(一)初识Kotlin之协程(二)取消
优点
- 轻量:您可以在单个线程上运行多个协程,因为协程支持挂起,不会使正在运行协程的线程阻塞。挂起比阻塞节省内存,且支持多个并行操作。
- 内存泄漏更少:使用结构化并发机制在一个作用域内执行多项操作。
- 内置取消支持:取消操作会自动在运行中的整个协程层次结构内传播。
- Jetpack 集成:许多 Jetpack 库都包含提供全面协程支持的扩展。某些库还提供自己的协程作用域,可供您用于结构化并发。
协程之HelloWorld实现
依赖引入
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0'
代码实现
GlobalScope.launch {
delay(1000)
Log.d(Constants.TAG,"World")
}
Log.d(Constants.TAG,"Hello")
效果
先输出Hello,协程延迟一秒输出World,打印日志如下:
2021-08-26 13:50:00.207 26316-26316/demo.demo.democoroutines D/Coroutines: Hello
2021-08-26 13:50:01.230 26316-26754/demo.demo.democoroutines D/Coroutines: World
协程之结构化的并发
结构化并发,听起来感觉不是太好理解,其实主要是为了实现对协程的管理。如果我们任意地
去启动协程而不做管理会出现如我们不需要了,但是我们没有引用与取消,协程还在运行等
诸如此类的问题。结构化并发主要是通过创建顶级协程进行协程任务的统一管理,当然这属
于个人通俗的理解,如有问题或者有什么其他的看法,欢迎指出与讨论。
代码实现
主要是通过 runBlocking等协程构建器将函数转换为协程,方法的调用和常规调用一直
private fun test()= runBlocking {
val job = GlobalScope.launch {
repeat(100){
delay(1000)
Log.d(Constants.TAG,"协程打印:$it")
}
}
delay(5*1000)
job.cancel()
}
协程之取消
进行循环一百次打印(每次延迟1s),在5s之后取消。
代码实现
private fun test()= runBlocking {
val job = GlobalScope.launch {
repeat(100){
delay(1000)
Log.d(Constants.TAG,"协程打印:$it")
}
}
delay(5*1000)
job.cancel()
}
效果
可以看到打印了4次,到第5次打印的时候取消了任务不能再进行打印
2021-08-26 14:20:50.853 29331-29384/demo.demo.democoroutines D/Coroutines: 协程打印:0
2021-08-26 14:20:51.855 29331-29384/demo.demo.democoroutines D/Coroutines: 协程打印:1
2021-08-26 14:20:52.858 29331-29384/demo.demo.democoroutines D/Coroutines: 协程打印:2
2021-08-26 14:20:53.865 29331-29384/demo.demo.democoroutines D/Coroutines: 协程打印:3
协程之Join
join函数作用
主要是实现占用执行,执行完毕之后再进行其他协程任务的执行
下面对比两种效果看下join的作用
代码实现1
private fun test()= runBlocking {
GlobalScope.launch {
delay(500)
Log.d(Constants.TAG,"job-test")
}
GlobalScope.launch {
delay(1000)
Log.d(Constants.TAG,"World")
}
Log.d(Constants.TAG,"Hello")
}
效果1
打印日志如下(可以看出job-test穿插在helloworld中间执行):
2021-08-26 14:06:08.607 27747-27747/demo.demo.democoroutines D/Coroutines: Hello
2021-08-26 14:06:09.133 27747-27807/demo.demo.democoroutines D/Coroutines: job-test
2021-08-26 14:06:10.578 27747-27807/demo.demo.democoroutines D/Coroutines: World
代码实现2
private fun test()= runBlocking {
val job = GlobalScope.launch {
delay(500)
Log.d(Constants.TAG,"job-test")
}
job.join()
GlobalScope.launch {
delay(1000)
Log.d(Constants.TAG,"World")
}
Log.d(Constants.TAG,"Hello")
}
效果
打印日志如下(可以看出helloworld在job-test执行完毕之后才进行执行):
2021-08-26 14:16:01.914 28884-28927/demo.demo.democoroutines D/Coroutines: job-test
2021-08-26 14:16:01.916 28884-28884/demo.demo.democoroutines D/Coroutines: Hello
2021-08-26 14:16:02.919 28884-28927/demo.demo.democoroutines D/Coroutines: World
总结
本文主要对协程的概念、优点及使用做了相关的介绍,实现了简单的协程编程,如HelloWorld
、结构化编程、取消、Join等,记录自己的学习与理解的相关内容,当然希望也能对大家有
那么一点点的帮助或者启发,我就很开心了。当然了本人也是在学习与理解的过程中记录与理解
难免有一定的认知局限性,如果发现有什么问题,欢迎指正,谢谢。