【发布时间】:2018-04-20 22:49:27
【问题描述】:
我这样创建BehaviorSubject:
private val viewStateSubject: BehaviorSubject<StateT> = BehaviorSubject.create()
稍后我会通过以下方式订阅它:
viewStateDisposable = viewStateSubject
.defaultIfEmpty(createInitialState())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(view::switchToState)
但它从不发出任何项目。但是,如果我使用默认值创建主题,如下所示:
private val viewStateSubject: BehaviorSubject<StateT> = BehaviorSubject.createDefault(createInitialState())
并从订阅中删除defaultIfEmpty,然后它会发出默认值。 AFAIK 这是因为默认情况下 BehaviorSubject 是用 EMPTY 值初始化的,所以它实际上永远不会为空。
很遗憾,我无法使用第二种解决方案。那我怎样才能切换到默认值呢?请注意,我希望能够多次订阅和取消订阅同一主题,并且仅在第一次订阅时接收默认值。这意味着我不能立即将默认值传递给主题或skip。
【问题讨论】:
-
defaultIfEmpty 要求源在没有项目的情况下完成。为什么不能使用第二种解决方案?您可以使用 startWith 或简单地将初始值推送到 BehaviorSubject 中。
-
如您所见,初始值是通过方法提供的。它不是最终方法,我在构造函数中启动主题。我是使用 startWith 还是 push 那么这个值将在每次尝试订阅时被推送,而我只在第一个时才需要它。
-
所以你有多个消费者,你希望他们中只有一个收到初始值?
-
没有。我需要一个项目,除非我发布新项目,否则它将为任何人发布。同时我不能使用createDefault。
-
你可以访问
viewStateSubject吗?如果是,请尽早致电viewStateSubject.onNext(initialObject)。也不知道为什么你不能拥有createDefault,但这是更合适的方式。谁拥有该创建代码?
标签: java kotlin rx-java rx-java2