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

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

<<:  下载nodejs

>>:  [DAY1]前言

#28 Click! Serve! Desktop

昨天已经把大部分的 GUI 弄完了,之前也已经写好了服务器的程序,今天我们把两边拼起来吧! 搬移 s...

【Day 28】练习专案 1/2 - NFC、Barcode、fontFamily、Stack、sliding_up_panel

今日要点 》前言 》介绍 Demo 专案 》程序架构研究 前言 前面精选了很多在 Github 上很...

Debian+KDE 上安装gcin的纪录

sudo apt install libappindicator3-1 sudo apt insta...

iOS APP 开发 OC 第七天, 对象在内存中的储存

tags: OC 30 day 1. 内存中的五大区域: 栈 储存局部变量。 堆 工程师手动申请的字...

Day 22:计算机概论

前言 计算机概论虽然是高中职的学科,但这也是身为工程师的基本常识,没有这些底子我们甚至没有办法跟其他...