.

iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0
Mobile Development

【Kotlin Notes And JetPack】Build an App系列 第 10

Day 10.【Corountines】Coroutines Basic

  • 分享至 

  • xImage
  •  

以下要進入 Coroutines 時光,雖然現在還是只知道淺淺的,目前也只紀錄我理解的部分,以下如有解釋不清或是描述錯誤的地方還請大家多多指教:

什麼?

是一個由官方提供處理異步協程的 api,以結構化併發的方式執行,也就是說將我們的線程封裝起來,提供統一的入口與出口,在這個協程結束時能確保所有執行緒都被完成或取消,new 一個 coroutine 必須在一個完整的 CoroutineScope 裡,而 CoroutineScope 會需要透過以下幾個物件組成 CoroutineContext:

| Job

是一個可取消且有生命週期的背景執行工作,依附在 parent-child 的結構層,只要一取消所有子層行為都會跟著取消,以及在完成工作之後結束,也可透過 SupervisorJob 去客製化行為,以下有兩種較常見的 job interface:

  • Coroutine job : 透過 launch coroutine builder 創建,在 lunch 的 block 內執行所有工作
  • CompletableJob: 透過 Job() factory 的 function 創建,必須呼叫 CompletableJob.complete 來表示完成

| CoroutineDispatcher

Thread 的切換,來看看有幾種切換模式:

  • Dispatchers.Default: 適合用來會消耗 CPU 的數據運算,像是排序、演算法、資料解析等,而thread 最多會開跟 CPU core 一樣 ,最少會有兩個
  • Dispatchers.IO: 進行網路請求或資料拿取等 IO 程序,減輕程序的阻塞
  • Dispatchers.Main: 在主線程,適合於介面呈現,像是呼叫 suspend function、LiveData 的 Update 等
  • Dispatchers.Unconfined: 不指定,跟隨當前的 thread,不建議使用

透過 withContext() 來切換不同的模式:

CoroutineScope(Dispatchers.IO).launch {
   // do something in IO
   withContext(Dispatchers.Main) {
      // do something in Main
   }
}

而 coroutine builders 又分成 launch 跟 async:

| launch

結束之後不會回傳結果,也不會 block 住 main thread,所以到 lunch 執行時,不會因為還沒執行完下面就卡住不做。

fun main() = runBlocking { // this: CoroutineScope
    var first = "first word"
    var second = "second word"
    launch(Dispatchers.IO) { first = sayHello() }
		launch(Dispatchers.IO) { second = sayWorld() }
    println("$first")
    println("$second")
}

suspend fun sayHello(): String {
	  delay(1000L)
    return "Hello"
}

suspend fun sayWorld(): String {
		delay(1000L)
    return "World"
}

// get below 
// first word
// second word

| async

結束之後會回傳結果,透過 await() 來等待結果,async 就會等待 coroutine 執行結束後才往下。

fun main() = runBlocking { // this: CoroutineScope
    var first = async(Dispatchers.IO) { sayHello() }
	var second = async(Dispatchers.IO) { sayWorld() }
    println("${first.await()}")
    println("${second.await()}")
}

suspend fun sayHello(): String {
	delay(1000L)
    return "Hello"
}

suspend fun sayWorld(): String {
	delay(1000L)
    return "World"
}

// get below 
// Hello
// World

如何?

今天不會有實作的範例,實作會跟下一篇一起:

| Set up

因為他不是包含在 standard library,需要使用者新增 dependency :

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'

Reference

Kotlin Coroutines in Android Summary
Official Kotlin
Android Kotlin


上一篇
Day 9.【Classes and Objects】Delegate Properties
下一篇
Day 11. 【Corountines】Coroutines 串接 API
系列文
【Kotlin Notes And JetPack】Build an App30
.
圖片
  直播研討會

尚未有邦友留言

立即登入留言