协程解析:
GlobalScope.launch(Dispatchers.Main) {//开始协程:主线程val result = userApi.getUserSuspend("suming")//网络请求(IO 线程)tv_name.text = result?.name //更新 UI(主线程)
}
协程关于线程切换的四种调度器:
协程共有以下四种启动模式:
还有一个问题就是关于协程的上下文,它们均继承自CoroutineContext::
经常和协程搭配使用的还有一个kotlin操作符flow,记一下其使用方式:
(1)flow{ … }内部可以调用suspend 函数;
(2)使用 emit() 方法来发射数据;
(3)使用 collect() 方法来收集结果。
例如:上流
fun simpleFlow() = flow {for (i in 1..3) {delay(100)emit(i)}
}fun main() {runBlocking {//下流处理数据simpleFlow().collect { value ->println(value)}println("finished")}
}结果:
1
2
3
finished
2、Flow是冷流,所以collect是挂起函数,不是子协程,并且只有执行collect函数时,上流的代码才会被执行,所以在一个协程中多次调用collect,它们会按顺序执行。
fun simpleFlow() = flow {for (i in 1..3) {delay(100)emit(i)}
}fun main() {runBlocking {simpleFlow().collect { value ->println(value)}println("collect1 finished")simpleFlow().collect { value ->println(value)}println("collect2 finished")}
}结果:
1
2
3
collect1 finished
1
2
3
collect2 finished
创建一个简单地flow
flow {(5 .. 10).forEach {emit(it)}
}.collect{println(it)
}
上一篇:多线程 (六) 单例模式
下一篇:主动学习相关论文、代码