Kotlin Coroutines 中是不是有 RxJava 主题的类似物?

Posted

技术标签:

【中文标题】Kotlin Coroutines 中是不是有 RxJava 主题的类似物?【英文标题】:Is there analogue for RxJava Subject in Kotlin Coroutines?Kotlin Coroutines 中是否有 RxJava 主题的类似物? 【发布时间】:2020-05-21 08:03:33 【问题描述】:

2020 年,很多安卓开发者都在谈论 Kotlin 协程。我正在尝试理解它以及协程如何在我的项目中帮助我。

所以我的问题是:RxJava 主题的协程中是否有类似物?(至少对于 PublishSubject)。

我想要什么 - 我使用 PublishSubject 将事件从 ViewModel 发送到我的 View。我在 onStart() 方法上订阅 eventsSubject 并在 onStop() 方法上处理。

所以对 Kotlin Coroutines 模拟的最低要求是:

轻松测试(我使用 TestSubscriber,它很棒) 我想在不缓冲的情况下发送事件 轻松订阅/取消订阅

有我的用例示例:

视图模型:

abstract class AbsStateViewModel<State, Event> : AbsViewModel() 
    private val stateSubject = BehaviorSubject.create<State>()
    private val eventSubject = PublishSubject.create<Event>()

    protected val requireState: State
        get() = stateSubject.value!!

    fun getStateObservable(): Observable<State> = stateSubject

    fun getEventObservable(): Observable<Event> = eventSubject

    protected fun sendEvent(event: Event) 
        eventSubject.onNext(event)
    

    protected fun setState(state: State) 
        stateSubject.onNext(state)
    

及用法:

viewModel.getEventObservable() // called on onAttach()
            .subscribe(
                    this::handleEvent,
                    this::defaultHandleException
            )
            .disposeOnDetach() // my extensions 

【问题讨论】:

AFAIK ChannelSubject 的典型替代品,尤其是在这种情况下。或者,使用LiveData,就像您在此处所做的那样,为更深层(视图模型 存储库等)保留协程/RxJava。 默认情况下 LiveData 存储最后一项(如 BehaviourSubject),我不喜欢 LiveData 的解决方法。我使用 LiveData 作为状态(视图需要在订阅 viewModel 时获取当前状态),我正在寻找主题替换,但我仍然没有看到它 然后,使用Channel 这里是一组镜像 RxJava 的主题实现:github.com/akarnokd/kotlin-flow-extensions#publishsubject 您找到示例解决方案了吗?我也想知道。 【参考方案1】:

是的,在协程中有 rx 主题的类似物,即通道。如果你想重现PublishSubject 的行为,你可以使用BroadcastChannel 否则如果你想重现BehaviorSubject 的行为,你可以使用ConflatedBroadcastChannel

【讨论】:

是的,但它仍在@ExperimentalCoroutinesApi ( 您能否提供示例,如何从 View 订阅和取消订阅频道?请记住,事件计数可以从 0 到 N,所以我不知道事件计数 是的,我知道,我正在等待下一个 kotlin 版本来使用它们。您可以在 ui 中通过生命周期范围使用它们:lifecycleScope.launch for (value in channel) ... do something lifecycleScope 会在 ui 死机时自动关闭频道。

以上是关于Kotlin Coroutines 中是不是有 RxJava 主题的类似物?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin Coroutines 的现有 3 函数回调

Kotlin Coroutines不复杂, 我来帮你理一理

如何使用 Kotlin Coroutines 在 Retrofit 中处理 204 响应?

`kotlinx.coroutines.withContext` 与 Spring WebFlux 一起使用是不是安全?

次时代Java编程 vertx-lang-kotlin-coroutines介绍

Kotlin Coroutines 协程实现原理全解析