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
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言