gpt4 book ai didi

java - BehaviourSubject 不被视为空

转载 作者:行者123 更新时间:2023-12-02 11:20:39 25 4
gpt4 key购买 nike

我像这样创建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值初始化的,所以它实际上永远不会是空的。

不幸的是我无法使用第二种解决方案。那我怎样才能切换到默认值呢?请注意,我希望能够多次订阅和取消订阅同一主题,并且仅在第一次订阅时接收默认值。这意味着我无法立即将默认值传递给主题或先跳过

最佳答案

AFAIK it is because by default BehaviorSubject is initialized with EMPTY value, so it is never actually empty.

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

<小时/>

关于defaultIfEmpty():

defaultIfEmpty()仅当 Observable 完成且不发出任何项目时才会生效。因此,只有调用 onCompleted() 才会起作用。完成发射项目后,在您的 viewStateSubject 上。

<小时/>

Notice that I want to be able to subscribe and unsubscribe to the same subject multiple times and receive default value only on the first subscription.

我认为带有默认项的 BehaviorSubject.create()defaultIfEmpty() 都不能为您实现此目的。

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

defaultIfEmpty():如前所述,只有在 BehaviorSubject 完成且未发出任何项目的情况下,这才会生效。

<小时/>

编辑:在评论中澄清后:

您可以先发出默认项目。每个新订阅者都会收到该项目,除非发出任何其他项目。

来自doc :

Subject that emits the most recent item it has observed and all subsequent observed items to each subscribed Observer.

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

关于java - BehaviourSubject 不被视为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49950645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com