Rx java 如何在每次共享流获得一个新订户时,从.startWith()获取一个共享可观察对象以发出一个新值?

Rx java 如何在每次共享流获得一个新订户时,从.startWith()获取一个共享可观察对象以发出一个新值?,rx-java,reactive-programming,rx-java2,Rx Java,Reactive Programming,Rx Java2,我需要一个共享observable,以便在每次订阅共享流时发出一个新的.startWith()值(订户计数从0变为1)。不幸的是,.startWith()返回的值在共享可观察实例的整个生命周期内都被重用,即使在该共享流没有订户之后也是如此 理想情况下,会有一个.startWith()重载,该重载将函数作为参数,并在订户计数从0-1更改时重新执行 var count: Int = 0 @Before fun setUp() { count = 0 //reset } fun getTh

我需要一个共享observable,以便在每次订阅共享流时发出一个新的
.startWith()
值(订户计数从0变为1)。不幸的是,
.startWith()
返回的值在共享可观察实例的整个生命周期内都被重用,即使在该共享流没有订户之后也是如此

理想情况下,会有一个
.startWith()
重载,该重载将函数作为参数,并在订户计数从0-1更改时重新执行

var count: Int = 0

@Before
fun setUp() {
    count = 0 //reset
}

fun getTheCount(): Int {
    count++
    return count
}

@Test
fun startWithDefaultValue() {
    val relay = PublishRelay.create<Int>()

    val instance by lazy {
        relay
                .startWith(getTheCount())
                .share()
    }

    val disposable1 = instance.subscribe {
        println(it) //should print 1, and does!
    }

    disposable1.dispose() //subscriber count on shared instance drops from 1 to 0

    //should print 2, but prints 1. getTheCount() is not called again on this subscription
    val disposable2 = instance.subscribe {
        println(it) 
    }
}
var计数:Int=0
@以前
趣味设置(){
计数=0//重置
}
fun gethecount():Int{
计数++
返回计数
}
@试验
fun startWithDefaultValue(){
val relay=PublishRelay.create()
通过lazy创建val实例{
转发
.startWith(getTheCount())
.share()
}
val disposable1=instance.subscribe{
println(it)//应该打印1,确实如此!
}
disposable1.dispose()//共享实例上的订户计数从1下降到0
//应打印2,但打印1。在此订阅上不会再次调用getTheCount()
val disposable2=instance.subscribe{
println(it)
}
}

我猜
val instance by lazy
意味着初始化一次,因此您只需调用
getTheCount()
方法。(我也希望您理解,
Observable.just(getTheCount())
将向每个观察者发出相同的值,并且不再“调用”
getTheCount()

您应该延迟延迟延迟的内部操作:

Observable.defer(() -> relay.startWith(getTheCount()))
.share();
或者使用可调用的
和concatWith:

relay.concatWith(Observable.fromCallable(() -> getTheCount()))
.share();

注意,我使用了
.startWith(Observable.fromCallable{getTheCount})