【问题标题】:RxJava2: onComplete not called with flatMapIterableRxJava2:未使用 flatMapIterable 调用 onComplete
【发布时间】:2017-10-06 05:26:58
【问题描述】:

这里是简短的 sn-p 代码:

    val subject = BehaviorSubject.createDefault(emptyList<Int>())
    subject.onNext(Arrays.asList(1, 2, 3))
    subject.flatMapIterable { list: List<Int> -> list }
            .subscribeBy(
                    onNext = { l("on next", it) },
                    onComplete = { l("on complete") }
            )

为什么onComplete 不在这里打电话?我应该怎么做才能处理这段代码?因为在原始代码中我不能使用.toList() 方法。

【问题讨论】:

  • 你为什么使用BehaviorSubject?你必须明确地调用onComplete()
  • 为什么会在这里调用onComplete?您的主题尚未完成发射项目 - 您仍然可以使用项目调用 onNext
  • @zsmb13 那么 onCompete 的调用和主题中的一样吗?我认为它会被 flatMapIterable 中的 observable 重新定义。
  • flatMapIterable 只会根据它自己收到的事件发出事件。在 onComplete 的情况下,它会在它链接到的任何内容完成时完成。
  • @zsmb13 感谢您的回答。我尝试在主题上调用onComplete 方法,但没有调用onNext,只有订阅者的onComplete。我如何按预期工作,即 flatMap 可通过调用订阅者的onNextonComplete 进行迭代?

标签: kotlin rx-java2 rx-kotlin2


【解决方案1】:

除非在其上调用onComplete,否则您所拥有的BehaviorSubject 是一个无限源。因此flatMapIterable 不会完成,您的onComplete 处理程序将永远不会被调用。

所以要么你完成BehaviorSubject:

val subject = BehaviorSubject.createDefault(emptyList<Int>())
subject.onNext(Arrays.asList(1, 2, 3))
subject.flatMapIterable { list: List<Int> -> list }
       .subscribeBy(
                onNext = { l("on next", it) },
                onComplete = { l("on complete") }
       )

subject.onComplete() // <-----------------------------------------------------

或者你最多拿一件

val subject = BehaviorSubject.createDefault(emptyList<Int>())
subject.onNext(Arrays.asList(1, 2, 3))
subject.take(1) // <----------------------------------------------------------
       .flatMapIterable { list: List<Int> -> list }
       .subscribeBy(
                onNext = { l("on next", it) },
                onComplete = { l("on complete") }
       )

【讨论】:

  • @akarnold 感谢您的回答,但是当我完成BehaviorSubject 时,新订阅者将不会收到onNext 事件,正如我所料。
  • 在这种情况下使用ReplaySubjectAsyncSubject
  • @akarnold 谢谢。 AsyncSubject 按我的预期工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 2016-10-03
  • 1970-01-01
相关资源
最近更新 更多