ChannelFlow 是一个抽象类,并且被标记为内部 Api,不应该在外部代码直接使用。 注意到它内部有一个方法 produceImpl 返回的是一个 ReceiveChannel,它的实现是收集上游发射的数据,然后发送到 Channel 中。 有此作为基础。我们可以 调用 asChannelFlow 将Flow 转换 ChannelFlow, 进而转换成 Channel 。1.1...
receiveAsFlow:Channel转换为Flow,上游与下游是一对一的关系。如果有多个下游观察者,可能会轮流收到值。 consumeAsFlow:Channel转换为Flow,有多个下游观察者时会crash。 withIndex:将数据包装成IndexedValue类型,内部包含了当前数据的Index。 scan(initial: R, operation: suspend (accumulator: R, value: T) -> R)...
后面讲的 ChannelFlow 就是热流。只有上游产生了数据,就会立即发射给下游的收集者。 1.5 Flow 的取消 流采用了与协程同样的协助取消。流的收集可以在当流在一个可取消的挂起函数(例如 delay)中挂起的时候取消。取消Flow 只需要取消它所在的协程即可。 以下示例展示了当 withTimeoutOrNull 块中代码在运行的时候流...
StateFlow 和 SharedFlow 是 hot stream。 例如,实时搜索词进行查询的场景: View 通过 channel 将查询词传递给 viewmodel 层,viewmodel 中将 channel 转换为 flow, 再 map 进行查询。这里的 channel 就可以用 flow 替代。 参考 https://www.kodeco.com/9799571-kotlin-flow-for-android-getting-started https://...
方式四,channelFlow:支持缓冲通道,线程安全,允许不同的CorotineContext发送事件。 val channelFlow = channelFlow<Int> { for (i in 1..10) { delay(100) send(i) } } 1. 2. 3. 4. 5. 6. 3、消费 val flow = flow<Int> { for (i in 1..10) { ...
在Kotlin中,Flow是Kotlin Coroutines库中的一个重要概念,用于处理异步和并发数据流。Flow可以帮助你轻松管理和处理异步的、实时的数据流,比如从网络获取的数据流、数据库更新流等等。 Flow的类型 Kotlin中的Flow主要有以下几种类型: 1、Cold Flow: 默认情况下,Flow是冷流(Cold Flow),即只有在收集时才会执行实际的...
最后的 channelFlow builder 跟 flow builder 是有一定差异的。 flow 是 Cold Stream。在没有切换线程的情况下,生产者和消费者是同步非阻塞的。 channel 是 Hot Stream。而 channelFlow 实现了生产者和消费者异步非阻塞模型。 下面的代码,展示了使用 flow builder 的情况,大致花费1秒: 代码语言:javascript 代码运行...
receiveAsFlow:Channel转换为Flow,上游与下游是一对一的关系。如果有多个下游观察者,可能会轮流收到值。 consumeAsFlow:Channel转换为Flow,有多个下游观察者时会crash。 withIndex:将数据包装成IndexedValue类型,内部包含了当前数据的Index。 scan(initial: R, operation: suspend (accumulator: R, value: T) -> R)...
flow 的代码块只有调用 collected() 才开始运行,正如 RxJava 创建的 Observables 只有调用 subscribe() 才开始运行一样。4.2 Hot Stream 如图上所示,可以借助 Kotlin Channel 来实现 Hot Stream。4.3. Completion Flow 完成时(正常或出现异常时),如果需要执行一个操作,它可以通过两种方式完成:imperative、declarativ...
StateFlow 经常被用来替代 LiveData 充当架构组件使用,所以大家相对熟悉。其实 StateFlow 只是 SharedFlow 的一种特化形式,SharedFlow 的功能更强大、使用场景更多,这得益于其自带的缓存系统,本文用图解的方式,带大家更形象地理解 SharedFlow 的缓存系统。 创建SharedFlow 需要使用到MutableSharedFlow()方法,我们通过方法的三...