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()
}
}