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
【问题讨论】:
AFAIKChannel
是 Subject
的典型替代品,尤其是在这种情况下。或者,使用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 在 Retrofit 中处理 204 响应?
`kotlinx.coroutines.withContext` 与 Spring WebFlux 一起使用是不是安全?