Kotlin协程(Coroutines)是Kotlin提供的一种轻量级的线程模型,它允许我们以非阻塞的方式编写异步代码,而无需使用回调、线程或复杂的并发API。协程是一种用户态的轻量级线程,它可以在需要时挂起和恢复,从而有效地管理资源,提高应用程序的响应性和性能。
Kotlin协程的概念
-
轻量级线程:协程比传统线程更轻量级,因为它们不需要线程切换的开销,且可以在单个线程中执行多个协程。
-
非阻塞:协程允许我们以同步的方式编写异步代码,而无需等待I/O操作完成。当I/O操作正在进行时,协程可以挂起并释放资源,以便其他协程可以运行。
-
挂起与恢复:协程可以在任何点挂起(暂停)和恢复(继续)执行,这使得它们非常适合处理I/O密集型任务,如网络请求或文件读写。
-
协程构建器:Kotlin使用
launch
和async
等构建器来创建协程。launch
用于启动一个协程并立即返回,而async
则返回一个Deferred
对象,该对象表示异步计算的结果。
Kotlin协程的使用
-
添加依赖:要在项目中使用Kotlin协程,首先需要添加相关的依赖项。对于Kotlin 1.3及更高版本,可以使用
kotlinx-coroutines-core
库。 -
创建协程:使用
GlobalScope.launch
或CoroutineScope.launch
方法创建协程。例如,以下代码演示了如何在全局范围内启动一个协程:
import kotlinx.coroutines.GlobalScope | |
import kotlinx.coroutines.launch | |
fun main() = runBlocking { | |
GlobalScope.launch { | |
delay(1000) // 挂起协程1秒 | |
println("Hello from coroutine!") | |
} | |
// 注意:在main线程中使用runBlocking来等待协程完成 | |
delay(2000) // 防止main线程立即退出 | |
} |
注意:在main
函数中使用runBlocking
是为了防止主线程立即退出。在实际应用中,通常会在UI线程或其他事件循环线程中启动协程,并使用适当的协程构建器。
-
处理异步结果:使用
async
构建器可以获取异步计算的结果。以下示例演示了如何使用async
和await
来获取异步结果:
import kotlinx.coroutines.GlobalScope | |
import kotlinx.coroutines.async | |
import kotlinx.coroutines.delay | |
import kotlinx.coroutines.runBlocking | |
fun main() = runBlocking { | |
val deferred = GlobalScope.async { | |
delay(1000) // 模拟耗时操作 | |
"Hello from coroutine!" | |
} | |
println("Starting coroutine...") | |
val result = deferred.await() // 等待异步结果 | |
println(result) | |
} |
-
协程作用域:在Kotlin中,协程作用域(
CoroutineScope
)定义了协程的生命周期和调度器。你可以使用CoroutineScope.launch
和CoroutineScope.async
在特定作用域内启动协程。例如,在Android中,你可以使用lifecycleScope
(来自kotlinx-coroutines-android
库)在Activity或Fragment的生命周期内管理协程。 -
取消协程:你可以使用
Job
或Deferred
对象来取消协程。当协程被取消时,它将停止执行并释放资源。以下示例演示了如何取消协程:
import kotlinx.coroutines.* | |
fun main() = runBlocking { | |
val job = GlobalScope.launch { | |
try { | |
repeat(1000) { i -> | |
println("Tick $i") | |
delay(100) | |
} | |
} finally { | |
println("Coroutine completed") | |
} | |
} | |
delay(1300) // 延迟一段时间 | |
job.cancel() // 取消协程 | |
job.join() // 等待协程完成(或取消) | |
} |
在这个例子中,协程在打印了几个“Tick”消息后被取消,并且最终输出了“Coroutine completed”。
标签:之协程,协程,launch,kotlin,基础,kotlinx,coroutines,线程,Kotlin From: https://blog.csdn.net/VitorLiu/article/details/139307406