iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0
自我挑戰組

社畜轉行之旅,30天Kotlin學習筆記系列 第 16

Day 16 | 同步與非同步- Coroutines的Scope

  • 分享至 

  • xImage
  •  

Scope

Scope 指得是Coroutines 可以作用的範圍。

在Main thread上或IO thread 上或更多的 Worker thread,且可以在某個控制流(例如Activity的生命週期)中可被控制的。

在 Kotlin 裡頭使用任何標記 suspend 的 method都會在 Scope 裡面,用來控制 Coroutines 的行進與存活。

GlobalScope繼承自 CoroutineScope。它是 CoroutineScope 的一個實作,它的概念就是最高層級的 Coroutines ,作用的範圍伴隨著 Application的生命週期,用他可以避免 Coroutines 被過早結束,但這個用法類似直接呼叫靜態函數。

若直接實作GlobalScope

class CoroutineActivity : AppCompatActivity(), CoroutineScope {
    override val coroutineContext: CoroutineContext
    get() =TODO("not implemented")
		//...省略
}

此時要求實作一個 CoroutineContext,就是 Coroutines 作用的情景,這邊可以指定他是在 Main thread 上或者就直接弄一個 Job 給他:

class CoroutineActivity : AppCompatActivity(), CoroutineScope {
    override val coroutineContext: CoroutineContext
    get() = job

    private val job =Job()
		//...省略
}

這樣執行的時候就會使用這個 Job 來操作了,如果沒有特別定義,這個 Job 會跑在Worker thread 上了,用它更新 UI 會噴 Exception。
Job 指的是 單一個 Coroutines 的生命週期。

要跑在 Main Thread 上,可以使用MainScrope

 class AndroidActivity {
   private val scope = MainScope()

   override fun onDestroy() {
     super.onDestroy()
     scope.cancel()
   }
 }

但上述多半是週期需要配合 View 本身而非 Activity ,當需要配合Activity時可以寫成:

 class MyActivity : AppCompatActivity(), CoroutineScope by MainScope() {
     override fun onDestroy() {
         cancel()
     }
}

上一篇
Day 15 | 同步與非同步- Coroutines
下一篇
Day 17 | 今天是Coroutiones的 Dispatcher
系列文
社畜轉行之旅,30天Kotlin學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言