在收集后订阅并不起作用

时间:2018-01-27 18:36:42

标签: java android kotlin rx-java rx-java2

我正在尝试使用RxJava。我需要一个Observable,它会产生一个HashSet<String>。进入Observable我想放弃Pair<String, Boolean> false布尔值从结果String中删除HashSet键的方式。这是我所拥有的代码片段:

private val selectionSubject = ReplaySubject.create<Pair<String, Boolean>>()
init {
    selectionSubject.onNext(Pair("dd", false))
    selectionSubject
        .collect({HashSet<String>()}, {dest, value -> collectSelection(dest, value)})
        .subscribe { t1, t2 -> Log.d(TAG, t1.toString())}
}

private fun collectSelection(dest: HashSet<String>, value: Pair<String, Boolean>): HashSet<String> {
    if (value.second) {
        dest.add(value.first)
    } else {
        dest.remove(value.first)
    }
    Log.d(TAG, "collectSelection, ${dest.toString()}")
    return dest
}

在日志中我可以看到collectSelection被调用但我的订阅者没有被调用。

如何解决?

1 个答案:

答案 0 :(得分:2)

collect在发出值之前等待来自上面的流的onComplete事件。在您的情况下,ReplaySubject永远不会结束,因此不会发出任何值。

在不知道selectionSubject的背景下,我无法为您的问题提供解决方案,例如,它是否必须保持开放状态?如果onNext次呼叫有限,您可以使用.take(X)。如果必须保持打开状态,则您不应该依赖于收集,而是将HashSet内的项目添加到.doOnNext

之类的内容中