BehaviorSubject不被视为空

时间:2018-04-20 22:49:28

标签: java kotlin rx-java rx-java2

我像这样创建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

1 个答案:

答案 0 :(得分:1)

  

AFAIK是因为默认情况下BehaviorSubject初始化为EMPTY值,因此它实际上从不为空。

不,如果在没有默认项目的情况下创建,BehaviorSubject不会发出任何内容。这就是为什么它永远不会在你的情况下发出任何东西。

关于defaultIfEmpty()

defaultIfEmpty()仅在Observable完成后才会生效而不会发出任何项目。因此,只有在您完成发布项目后在viewStateSubject上致电onCompleted()时,它才会有效。

  

请注意,我希望能够多次订阅和取消订阅同一主题,并且只能在第一次订阅时收到默认值。

我不认为BehaviorSubject.create()使用默认项目或defaultIfEmpty()可以为您服务。

带有默认项目的

BehaviorSubject.create(): 只要没有明确发出的项目,这将始终发出该默认值,无论其是否是第一次订阅。

defaultIfEmpty():如前所述,这只会在BehaviorSubject完成而不会发出任何项目时生效。

编辑:在评论中澄清后:

您可以先发出默认项目。除非发出任何其他项目,否则每个新订户都将收到该项目。

来自doc

  

主体发出它观察到的最新项目以及每个订阅观察者的所有后续观察项目。

viewStateSubject.onNext(createInitialState());
viewStateDisposable = viewStateSubject
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(view::switchToState)