Android 中使用kotlin 协程 首先要在gradle 中引入
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2"
Android 中kotlin 使用协程 个人认为其实是对java 代码中线程池的一种封装,简单了开发者使用,和对线程的管理.简单用法如下
fun launch() {
GlobalScope.launch {
delay(100)
println("这个是一个方法A ${Thread.currentThread().id}")
}
GlobalScope.launch {
delay(50)
println("这个是方法B ${Thread.currentThread().id}")
}
println("这个是方法c ${Thread.currentThread().id}")
}
GlobalScope.launch 是一个代码块需要携程执行的代码卸载代码块中.
结果是
2021-09-17 11:20:55.100 3333-3333/com.autohome.learnkotlin I/test: 这个是方法c 2
2021-09-17 11:20:55.156 3333-3410/com.autohome.learnkotlin I/test: 这个是方法B 35810
2021-09-17 11:20:55.206 3333-3410/com.autohome.learnkotlin I/test: 这个是一个方法A 35810
首先执行的是打印C 其次 执行协程 方法 并不能保证 协程的执行顺序
fun launchB() {
runBlocking {
val a = GlobalScope.async {
delay(100)
Log.i(TAG, "a: ${Thread.currentThread().id}")
return@async 100
}
val b = GlobalScope.async {
delay(200)
Log.i(TAG, "b: ${Thread.currentThread().id}")
return@async 200
}
val c = a.await() + b.await();
Log.i(TAG, "c:$c ${Thread.currentThread().id}")
}
}
运行结果
2021-09-17 11:24:31.038 3600-3660/com.autohome.learnkotlin I/test: a: 35825
2021-09-17 11:24:31.137 3600-3660/com.autohome.learnkotlin I/test: b: 35825
2021-09-17 11:24:31.137 3600-3600/com.autohome.learnkotlin I/test: c:300 2
async 同样是开启协程 和launch 类似 返回的是Deferred 是job 的子类
通过和await 搭配使用 可以达到 a b 运行完 执行c 但是耗时 并不是 a b 运行时间的和, 而是 ab同事执行, c 等待 ab 执行完之后再运行获取结果
fun launchC() {
runBlocking {
var c =GlobalScope.launch {
delay(150)
Log.i(TAG, "c: ")
}
var a = GlobalScope.launch {
delay(100)
Log.i(TAG, "a: ")
}
var b = GlobalScope.launch {
delay(200)
Log.i(TAG, "b: ")
}
a.join()
Log.i(TAG, "ssss: ")
}
Log.i(TAG, "launchC: ")
}
join 用法 当前协程加入到父线程当中 结果就是 当a执行完成之后才会执行打印launchC
2021-09-17 13:28:58.470 7119-7309/com.autohome.learnkotlin I/test: a:
2021-09-17 13:28:58.471 7119-7119/com.autohome.learnkotlin I/test: ssss:
2021-09-17 13:28:58.472 7119-7119/com.autohome.learnkotlin I/test: launchC:
2021-09-17 13:28:58.519 7119-7309/com.autohome.learnkotlin I/test: c:
2021-09-17 13:28:58.571 7119-7309/com.autohome.learnkotlin I/test: b: