Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 由主体构成的可观察变压器_Android_Kotlin_Rx Java_Rx Java2 - Fatal编程技术网

Android 由主体构成的可观察变压器

Android 由主体构成的可观察变压器,android,kotlin,rx-java,rx-java2,Android,Kotlin,Rx Java,Rx Java2,我目前正在实现一个具有视图-视图-模型循环依赖关系的模式。虽然这实际上不是依赖关系,因为他们彼此不了解,但他们所知道的只是有一个事件流和一个状态流。我提出了一个想法,让viewModel实现一个名为toTransformer()的函数,该函数返回一个ObservateTransformer,它由两个主题组成,一个事件主题和一个状态主题 private val eventStream: PublishSubject<MainEvent> = PublishSubject.create(

我目前正在实现一个具有视图-视图-模型循环依赖关系的模式。虽然这实际上不是依赖关系,因为他们彼此不了解,但他们所知道的只是有一个事件流和一个状态流。我提出了一个想法,让viewModel实现一个名为
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)
    }