Kotlin Flows 流 — 基础
上一篇研究了 Kotlin 协程。上一篇文章重点介绍了协程的一些基础知识,如协程上下文(CoroutineContext)、协程作用域(CoroutineScope)、协程构建器等。如承诺的那样,这是关于流(Flows)的后续文章。
什么是流?
可以异步计算的数据流被称为流(Flow)。Flow,像 LiveData 和 RxJava 流一样,允许你实现观察者模式:由一个对象(源)维护其依赖项列表,称为观察者(收集器),并在任何状态变化时自动通知它们。流使用挂起函数异步产生和消费值。
要创建流,首先你需要创建一个生产者:
val randomFlow: Flow<Int> = flow {
repeat(10) { it ->
emit(it+1) // 向流中发射请求的结果
delay(1000) // 挂起协程1秒
}
}
要收集流,首先你需要启动一个协程,因为流在底层是操作协程的。使用 collect
操作符来收集它发射的值。
lifecycleScope.launch {
viewModel.uiStateFlow.collect { it ->
binding.uiText.text = it.toString()
}
}
有两种不同类型的流:
冷流(Cold Flow)
它不会开始产生值,直到有人开始收集它们。它只能有一个订阅者,并且不存储数据。 // 常规流示例
val coldFlow = flow {
emit(0)
emit(1)
emit(2)
}
launch { // 第一次调用 collect
coldFlow.collect { value ->
println("cold flow collector 1 received: $value")
}
delay(2500)
// 第二次调用 collect
coldFlow.collect { value ->