2.6 KiB
2.6 KiB
Kotlin协程从入门到入土
0x00 什么是协程
协程,英文Coroutines,是一种比线程更加轻量级的存在。
协程不是进程,也不是线程,它就是一个可以在某个地方挂起的特殊函数,并且可以重新在挂起处继续运行。所以说,协程与进程、线程相比,不是一个维度的概念。
协程已经在Python、JS等许多编程语言上有所实现,一般情况下,协程被认为是比线程更轻量级的异步事件处理方式,所谓协程,是在编程语言层面上对同时执行多个异步任务上的实现。
协程通过将复杂性放入库来简化异步编程。程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。该库可以将用户代码的相关部分包装为回调、订阅相关事件、在不同线程(甚至不同机器!)上调度执行,而代码则保持如同顺序执行一样简单。
协程是一种并发设计模式,您可以在Android平台上使用它来简化异步执行的代码
简单来说,协程可以帮助开发者以同步方式编写异步代码,解决以往编写异步程序时出现的“回调地狱”的问题。
0x11 Kotlin上协程的分类
创建最简单的协程
先上代码:
// 调用阻塞式协程
runBlocking {
Log.d("runBlocking", "启动一个协程")
}
// 调用launch启动协程
GlobalScope.launch {
Log.d("launch", "启动一个协程")
}
// 调用async启动协程
GlobalScope.async {
Log.d("async", "启动一个协程")
}
如上面代码所示,Kotlin中创建启动协程主要有3种方式:
- runBlocking - 启动一个阻塞式协程,协程体代码块内代码会阻塞所在线程,返回值为泛型T,就是在协程体内最后一行返回的数据类型
- launch - 启动一个非阻塞式协程,必须在协程作用域(CoroutineScope)内启动,但不会阻塞所在线程,返回值为Job
- async - 启动一个非阻塞式协程,必须在协程作用域(CoroutineScope)内启动,但不会阻塞所在线程,返回值为一个Deferred,T泛型为协程体内最后一行返回的数据类型
- 协程的返回类型
-
runBlocking的泛型返回值T runBlocking在默认情况下类似于一个封装好的方法,当然可以通过指定该方法运行的线程,让这个方法不阻塞主线程,这样就类似于我们在Java中的Thread,并且将run方法执行的结果最终返回回来,这里不做过多讨论。
-
launch的返回类型Job
-
async的返回类型Deferred