Android 由主体构成的可观察变压器
我目前正在实现一个具有视图-视图-模型循环依赖关系的模式。虽然这实际上不是依赖关系,因为他们彼此不了解,但他们所知道的只是有一个事件流和一个状态流。我提出了一个想法,让viewModel实现一个名为Android 由主体构成的可观察变压器,android,kotlin,rx-java,rx-java2,Android,Kotlin,Rx Java,Rx Java2,我目前正在实现一个具有视图-视图-模型循环依赖关系的模式。虽然这实际上不是依赖关系,因为他们彼此不了解,但他们所知道的只是有一个事件流和一个状态流。我提出了一个想法,让viewModel实现一个名为toTransformer()的函数,该函数返回一个ObservateTransformer,它由两个主题组成,一个事件主题和一个状态主题 private val eventStream: PublishSubject<MainEvent> = PublishSubject.create(
toTransformer()
的函数,该函数返回一个ObservateTransformer
,它由两个主题组成,一个事件主题和一个状态主题
private val eventStream: PublishSubject<MainEvent> = PublishSubject.create()
private val stateSink: BehaviorSubject<MainState> = BehaviorSubject.create()
...
fun asTransformer(): ObservableTransformer<MainEvent, MainState> =
ObservableTransformer {
it.subscribe { eventStream.onNext(it) }
stateSink
}
问题
- 这样可以吗
- 这种实现可能会出现什么问题
- 如果已释放订阅,是否将释放内部订阅
- 这能改进成更好的形式吗
eventStream.map { it.toAction() }
.compose(actionToResult())
.scan (MainState.initial(), reducer())
.subscribe {
stateSink.onNext(it)
}
我不知道你是否以此为基础,但杰克·沃顿有一个 这样可以吗 一般来说,当然可以 这种实现可能会出现什么问题 您可能需要注意的一件事是,实际上您有一个大事件循环。如果事件循环终止,UI将无响应。正确的错误处理比以前更加重要。我确信上面的代码片段是你真正拥有的一个简化版本,但是考虑到没有错误处理块,内部订阅中的失败会冒泡到你自己的外部订阅,而这本身就失败了。此时,将不存在对UI事件的活动订阅 如果已释放订阅,是否将释放内部订阅 不,它不在同一条链条上 这能改进成更好的形式吗
特别是考虑到前面的答案,您可能希望去掉内部订阅,使其成为一个链。一个简单的方法是使用
flatMap
而不是订阅。状态是如何从事件派生的?不清楚你是如何处理的?嗨@yosriz,请看editYes,这是基于jake的介绍。错误处理在actionToResult()中
。我很小心地将onerrorreent()
放在每个动作子transformer
(构成我的主transformer
,actionToResult()
)上,以发出ErrorResult
,而不是传播异常。谢谢你,你说得对,'flatMap()
我怎么会忘记呢。非常感谢。fun asTransformer():observateTransformer=observateTransformer{it.flatMap{eventStream.onNext(it)stateSink}}
我现在遇到了问题。我没有支持文档,但是当行为主题
放在flatMap()中时。它不会发出最后发出的数据。操作,更正。Behavior subject运行良好,但在每次发布中,都会添加新的订阅。您不想将flatMap
添加到onNext
<代码>平面图
到实际流。我没有仔细考虑您的具体实现,但我怀疑PublishSubject
和BehaviorSubject
不一定是您需要的类。
eventStream.map { it.toAction() }
.compose(actionToResult())
.scan (MainState.initial(), reducer())
.subscribe {
stateSink.onNext(it)
}