Kotlin Coroutine , Coroutin (中文翻 “協程” )這個詞在android 常常會用到和聽到,
那到底是什麼意思呢? Kotlin Coroutin 在官網的說明是一個輕量的執行緒,可以協同排程其他的工作
順利的 執行,不會佔用主線程,在背景排程執行。
在Android 上就不會佔用主線程,造成UI卡頓,進而變成ANR。
第一支 Coroutine
GlobalScope.launch
fun main() {
GlobalScope.launch { //在背景啟動一個新的協程
delay(1000L)
println("World!")
}
println("Hello,") //主線程會馬上執行
}
runBlocking and Dispatchers
fun main() {
GlobalScope.launch { //在背景啟動一個新的協程
delay(1000L)
println("World!")
}
runBlocking (Dispatchers.IO){ //阻塞住主線程,在io線程上執行 ,用main線程就anr了
delay(500L)
println("Kotlin World!")
}
println("Hello,") //被阻塞住了主線程,就沒有馬上執行
}
suspend fun
fun main() {
GlobalScope.launch { //在背景啟動一個新的協程,並確保子線程
delay(1000L)
println("World!")
//等待子線程執行結束
jointest()
}
println("Hello,") //主線程會馬上執行
}
suspend fun jointest()= coroutineScope{
launch {
delay(4000L)
println("World! 2")
}
launch {
delay(2000L)
println("World! 1")
}
println("Hello,")
}
Coroutine context and Cancel job
fun main(){
val job = GlobalScope.launch {
GlobalScope.launch {
println("job1")
delay(1000)
println("job1 delay 1000")
}
//協程的上下文
launch {
delay(100)
println("job2 delay100")
delay(1000)
println("job2: delay1000")
}
}
job.cancel() // 請求執行"取消",job2就沒執行了
println("main: Hello")
}
結論:
後續會有結合 Android jetpack ViewModel LiveData 的實作範例
https://kotlinlang.org/docs/coroutines-guide.html