Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 行为主体不是';不被认为是空的_Java_Kotlin_Rx Java_Rx Java2 - Fatal编程技术网

Java 行为主体不是';不被认为是空的

Java 行为主体不是';不被认为是空的,java,kotlin,rx-java,rx-java2,Java,Kotlin,Rx Java,Rx Java2,我创建BehaviorSubject如下: private val viewStateSubject: BehaviorSubject<StateT> = BehaviorSubject.create() private val viewStateSubject: BehaviorSubject<StateT> = BehaviorSubject.createDefault(createInitialState()) 但它从不发射任何东西。但如果我用默认值创建subj

我创建
BehaviorSubject
如下:

private val viewStateSubject: BehaviorSubject<StateT> = BehaviorSubject.create()
private val viewStateSubject: BehaviorSubject<StateT> = BehaviorSubject.createDefault(createInitialState())
但它从不发射任何东西。但如果我用默认值创建subject,如下所示:

private val viewStateSubject: BehaviorSubject<StateT> = BehaviorSubject.create()
private val viewStateSubject: BehaviorSubject<StateT> = BehaviorSubject.createDefault(createInitialState())
private val viewStateSubject:BehaviorSubject=BehaviorSubject.createDefault(createInitialState())
并从订阅中删除
defaultIfEmpty
,然后它将发出默认值。这是因为默认情况下,BehaviorSubject是用
EMPTY
值初始化的,所以它实际上从来都不是空的

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

这是因为默认情况下,
BehaviorSubject
是用
EMPTY
值初始化的,所以它实际上从来都不是空的

否,
BehaviorSubject
如果在没有默认项的情况下创建,则不会发出任何信息。这就是为什么在你的情况下它从不发出任何东西


关于
defaultIfEmpty()

仅在
可观察的
完成且不发出任何项目时生效。因此,只有在完成项目的发送后调用
viewstatepubject
,它才会起作用


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

我认为使用默认项的
BehaviorSubject.create()
,或者
defaultIfEmpty()
都不能达到这个目的

BehaviorSubject.create()
带有默认项: 只要没有显式发出任何项,无论其是否为第一次订阅,它都将始终发出该默认值

defaultIfEmpty()
:如前所述,只有在
BehaviorSubject
完成且未发出任何项时,此选项才会生效


编辑:在评论中澄清后:

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

从:

将最近观察到的项目和所有后续观察到的项目发送给每个订阅的观察者的主题


defaultIfEmpty要求源在不包含项的情况下完成。为什么不能使用第二种解决方案?您可以使用startWith,也可以简单地将初始值推送到BehaviorSubject中。正如您所看到的,初始值是通过一个方法提供的。这是非最终方法,我在构造函数中启动主题。如果我使用startWith或push,则此值将在尝试订阅时被推送,而我只在第一个用户上需要它。因此,您有多个用户,并且您只希望其中一个用户收到初始值?否。我需要一个项目,除非我发布新项目,否则将为任何人发出该项目。同时,我不能使用createDefault。您有权访问
viewStateSubject
?如果是,只需尽早调用
viewstatepubject.onNext(initialObject)
。也不确定为什么不能使用
createDefault
,但这是更合适的方法。谁拥有那个创造代码?也许我把我的需求描述错了。我需要一个项目,这将是任何消费者发布的主题,直到我发布另一个项目。所以,createDefault确实是这样做的,但是没有createDefault的用法。我需要通用订阅代码,它可以被多次调用。在更新答案的示例中,如果我第一次运行此代码,那么结果是可以预期的。但是,如果我将新项目发送到subject中并为另一个订阅者运行相同的代码,它将获得默认项目,而不是上次发送的项目。@Lingviston您应该只在开始时调用
viewStateSubject.onNext(createInitialState())
一次。这很清楚。有没有办法用反应式的方式?没有添加标志或任何类似内容。反应方式是
BehaviorSubject.createDefault()
。除此之外,我不确定是否有办法。