Kotlin 协程之一:基础使用
系列文章:
Kotlin 协程之一:基础使用
Kotlin 协程之二:原理剖析
Kotlin 协程之三:Android中的应用
一.什么是协程
kotlin在1.3版本后,提供了协程coroutine库,协程提供了一种,简化异步任务处理的方案。
二.为什么用协程
1.简化代码,增加可读性
使用协程可以用简洁直观可读性高的写法,实现多重依赖关系的异步任务的书写。
先来回想一下我们平时的异步任务怎么实现呢?
(1).通过Callback回调的方式
//get token
TokenCall().addCallback(object:Callback{
override fun onCall(token: String) {
//get data with token
DataCall(token).addCallback(object :Callback{
override fun onCall(data: String) {
//do something with data...
}
})
}
})
这种经典实现的问题就不用多说了,代码量大,可读性差,还有最严重的回调地狱。
(2)通过链式调用
fun getToken():String{
}
fun getData(token:String):String{
}
Single.fromCallable {
//get token
getToken()
}.map {
token->
//get data with token
getData(token)
}.subscribe {
data->
//do something with data...
}
RXJava这种链式实现多重依赖的异步任务的方法,是现在我们用的最多的方案,可以有效地解决回调地狱的问题,相比于callback回调,可读性也增加了许多。
除了RXJava,java8提供的CompletableFuture、JS中提供的Promise,都是类似的解决方案。
这种写法虽然将异步任务过程打平的展现出来,但是毕竟还是在各个异步任务逻辑外面,套了一层RXJava的api,那有没有更简单的方法,只通过异步任务的逻辑代码的组合,就实现多重依赖的异步任务的处理呢?kotlin的协程为我们提供了一种方案。
(3)通过kotlin的协程
//挂起函数
suspend fun getToken() = suspendCancellableCoroutine<String>{
}
suspend fun getData(token:String) = suspendCancellableCoroutine<String> {
}
GlobalScope.launch {
//get token
val token = getToken()
//get data with token
val data = getData(token)