launch {
delay(1000)
finalRes = finalRes.plus(“1”)
}
launch {
delay(2000)
finalRes = finalRes.plus(“2”)
}
launch {
delay(3000)
finalRes = finalRes.plus(“3”)
}
}
finalRes
}
fun main() {
val test6 = test6()
println(“最终返回值是: $test6”)
}
最终返回结果为(延迟3秒之后打印):
最终返回值是: 123
- 如果有一个函数,需要顺序执行多个网络请求,并且后一个请求依赖前一个请求的执行结果
import kotlinx.coroutines.*
suspend fun getToken(): String {
for (i in 0…10) {
println(“异步请求正在执行:getToken :$i”)
delay(100)
}
return “ask”
}
suspend fun getResponse(token: String): String {
for (i in 0…10) {
println(“异步请求正在执行:getResponse :$token $i”)
delay(100)
}
return “response”
}
fun setText(response: String) {
println(“setText 执行,时间: ${System.currentTimeMillis()}”)
}
fun main() {
GlobalScope.launch(Dispatchers.Unconfined) {
var token = GlobalScope.async(Dispatchers.Unconfined) {
return@async getToken()
}.await() // 创建异步任务,并且 阻塞执行 await 是阻塞执行取得结果
var response = GlobalScope.async(Dispatchers.Unconfined) {
return@async getResponse(token)
}.await() // 创建异步任务,并且立即执行
setText(response)
}
Thread.sleep(20000)
}
执行结果:
异步请求正在执行:getToken :0
异步请求正在执行:getToken :1
异步请求正在执行:getToken :2
异步请求正在执行:getToken :3
异步请求正在执行:getToken :4
异步请求正在执行:getToken :5
异步请求正在执行:getToken :6
异步请求正在执行:getToken :7
异步请求正在执行:getToken :8
异步请求正在执行:getToken :9
异步请求正在执行:getToken :10
异步请求正在执行:getResponse :ask 0
异步请求正在执行:getResponse :ask 1
异步请求正在执行:getResponse :ask 2
异步请求正在执行:getResponse :ask 3
异步请求正在执行:getResponse :ask 4
异步请求正在执行:getResponse :ask 5
异步请求正在执行:getResponse :ask 6
异步请求正在执行:getResponse :ask 7
异步请求正在执行:getResponse :ask 8
异步请求正在执行:getResponse :ask 9
异步请求正在执行:getResponse :ask 10
setText 执行,时间: 1578904290520
- 当前正在执行一项异步任务,但是你突然不想要它执行了,随时可以取消
fun main() {
// 协程任务
val job = GlobalScope.launch(Dispatchers.IO) {
for (i in 0…100){// 每次挂起100MS,100次也就是10秒
println(“协程正在执行 $i”)
delay(100)
}
}
// 但是我在1秒之后就取消协程
Thread.sleep(1000)
job?.cancel()
println( “btn_right 结束协程”)
}
执行结果(本该执行100轮的打印,只持续了10轮):
协程正在执行 0
协程正在执行 1
协程正在执行 2
协程正在执行 3
协程正在执行 4
协程正在执行 5
协程正在执行 6
协程正在执行 7
协程正在执行 8
协程正在执行 9
btn_right 结束协程
Process finished with exit code 0
- 如果你想让一个任务最多执行3秒,超过3秒则自动取消
import kotlinx.coroutines.*
fun main() = runBlocking {