Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.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
有人能告诉我为什么RxJava2(v2.2.4)中的share操作符没有像我的单元测试中断言的那样运行吗?_Java_Android_Kotlin_Rx Java2 - Fatal编程技术网

有人能告诉我为什么RxJava2(v2.2.4)中的share操作符没有像我的单元测试中断言的那样运行吗?

有人能告诉我为什么RxJava2(v2.2.4)中的share操作符没有像我的单元测试中断言的那样运行吗?,java,android,kotlin,rx-java2,Java,Android,Kotlin,Rx Java2,根据我对share操作符的理解,我编写了以下测试: @Test fun `share operator`() { val expectedInvocations = 1 val counter = AtomicInteger() val shared = Completable.fromCallable { counter.incrementAndGet() } .toObservable<Any>() .share() .ignoreElemen

根据我对
share
操作符的理解,我编写了以下测试:

@Test
fun `share operator`() {
  val expectedInvocations = 1
  val counter = AtomicInteger()
  val shared = Completable.fromCallable { counter.incrementAndGet() }
    .toObservable<Any>()
    .share()
    .ignoreElements()

  Completable.merge(listOf(shared, shared)).test()

  assertThat(counter.get()).isEqualTo(expectedInvocations)
}
@测试
有趣的“共享操作符”(){
val预期职业=1
val计数器=原子整数()
val shared=Completable.fromCallable{counter.incrementAndGet()}
.TooObservable()文件
.share()
.ignoreElements()
Completable.merge(listOf(shared,shared)).test()
assertThat(counter.get()).isEqualTo(ExpectedInvestations)
}
可以看出,如果我共享一个可观察对象,并且多个观察者同时订阅,那么可调用对象将只被调用一次。但是,当我运行这个测试时,它失败了,因为调用了两次callable。

合并(可编辑源)

返回一个可完成实例,该实例一次订阅所有源,并且仅当所有源完成或其中一个发出错误时才完成

一次订阅所有来源仅在所有源完成表完成时完成

因此,两个可完成项都被执行,使您的计数器为2



有趣的阅读解释共享:

您的源代码是同步的,并且会立即结束,因此当合并转到第二个
共享
实例时,共享会断开连接,然后重新连接。@akarnokd这是我最初的怀疑,解决方案需要使用
subscribeOn
。但是,我不完全理解为什么在
shared
上添加
subscribeOn
操作符不会传播到
fromCallable
。它似乎适用于
share()
运算符的结果。如果使用
TestScheduler
并在合并后调用
triggerations
subscribeOn
置于
share()
之前,则结果与预期一致。我怀疑这意味着,如果在生产中,我使用
共享
,如果任何上游源是同步的,我将观察到相同的行为?不确定您在这里使用
共享
尝试实现什么。当源有限时,它将完成并共享断开连接,这只是时间问题,因此如果有多个观察者,它们可能会错过活动窗口。您是否正在尝试缓存结果并将其回放?共享单个元素源使多个观察者获取数据的可能性降低,最终可能什么也得不到或重新连接。请参阅。我正在尝试将大量的网络和数据库调用合并到一个可观察对象中,并希望知道它们何时完成。如果这项工作正在进行中,我想与各位观察员分享。如果新的观察者订阅时操作已经完成,则可以再次执行该操作。共享前的计划程序,甚至testscheduler,将延迟对源的实际订阅,以便merge可以订阅这两个源,然后(测试)调度程序将促进对源fromCallable的订阅。