協程三大做用域

runBlocking 做用域啓動協程

阻塞協程構造器

適用於單元測試的場景,而業務開發中不會用到這種方法

調用了 runBlocking 的主線程會一直 阻塞 直到 runBlocking 內部的協程執行完畢。複製代碼

GlobalScope 做用域啓動協程

非阻塞協程構造器

生命週期受整個應用程序的生命週期限制,且不能取消複製代碼

CoroutineScope 做用域啓動協程

非阻塞協程構造器

經過 context 參數去管理和控制協程的生命週期聲明本身做用域

它會建立一個協程做用域而且在全部已啓動子協程執行完畢以前不會結束複製代碼

runBlocking 與 coroutineScope 做用域的區別

在於後者在等待全部子協程執行完畢時不會阻塞當前線程。複製代碼

普通函數在協程中使用致使的異常

Error: Kotlin: Suspend functions are only allowed to be called from a coroutine or another 
suspend function掛起函數,只能在協程中使用複製代碼

設置取消協程的執行

val job = launch {
    repeat(1000) { i ->
            println("job: I'm sleeping $i ...")
        delay(500L)
    }
}
job.cancel() // 取消該做業
job.join() // 等待做業執行結束
有一個能夠使 Job 掛起的函數 cancelAndJoin 它合併了對 cancel 以及 join 的調用複製代碼

設置超時

withTimeout(1300L) {
    repeat(1000) { i ->
            println("I'm sleeping $i ...")
        delay(500L)
    }
}
該函數會跑出TimeoutCancellationException 異常
複製代碼

能夠使用 withTimeoutOrNull代替,經過返回 null 來進行超時操做,從而替代拋出一個異常
bash

val result = withTimeoutOrNull(1300L) {
    repeat(1000) { i ->
            println("I'm sleeping $i ...")
        delay(500L)
    }
    "Done" // 在它運行獲得結果以前取消它
}
println("Result is $result")

複製代碼


待續函數

相關文章
相關標籤/搜索