gpt4 book ai didi

android - 如何将项目发送到 Kotlin.Flow(如 Behaviorsubject)

转载 作者:行者123 更新时间:2023-12-04 06:01:48 25 4
gpt4 key购买 nike

我想知道如何将项目发送/发送到 Kotlin.Flow ,所以我的用例是:

在消费者/ViewModel/Presenter 中,我可以使用 collect 订阅功能:

fun observe() {
coroutineScope.launch {
// 1. Send event
reopsitory.observe().collect {
println(it)
}
}
}

但问题出在 Repository另一方面,对于 RxJava,我们可以使用 Behaviorsubject将其公开为 Observable/Flowable并发出这样的新项目:
behaviourSubject.onNext(true)

但是每当我建立一个新流程时:
flow {

}

我只能收集。如何将值发送到流?

最佳答案

如果您想获得订阅/收藏的最新值,您应该使用 ConflatedBroadcastChannel :

private val channel = ConflatedBroadcastChannel<Boolean>()

这将复制 BehaviourSubject ,将 channel 公开为流:
// Repository
fun observe() {
return channel.asFlow()
}


现在向暴露的 Flow 发送事件/值简单发送到这个 channel 。
// Repository
fun someLogicalOp() {
channel.send(false) // This gets sent to the ViewModel/Presenter and printed.
}

安慰:

false



如果您只想接收值 之后 你开始收集你应该使用 BroadcastChannel反而。

说清楚:

表现为 Rx 的 PublishedSubject
private val channel = BroadcastChannel<Boolean>(1)

fun broadcastChannelTest() {
// 1. Send event
channel.send(true)

// 2. Start collecting
channel
.asFlow()
.collect {
println(it)
}

// 3. Send another event
channel.send(false)
}


false



仅限 false在发送第一个事件时打印 之前 collect { } .

表现为 Rx 的 BehaviourSubject
private val confChannel = ConflatedBroadcastChannel<Boolean>()

fun conflatedBroadcastChannelTest() {
// 1. Send event
confChannel.send(true)

// 2. Start collecting
confChannel
.asFlow()
.collect {
println(it)
}

// 3. Send another event
confChannel.send(false)
}

true

false



两个事件都被打印出来,你总是得到 最新值(如果存在)。

另外,想在 DataFlow 上提一下 Kotlin 的团队开发。 (名称待定):
  • https://github.com/Kotlin/kotlinx.coroutines/pull/1354

  • 这似乎更适合这个用例(因为它将是 cold stream )。

    关于android - 如何将项目发送到 Kotlin.Flow(如 Behaviorsubject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57345311/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com