Android RxJava-将delaySubscription与withLatestFrom一起使用

Android RxJava-将delaySubscription与withLatestFrom一起使用,android,rx-java,rx-java2,Android,Rx Java,Rx Java2,很难解释我的问题,这就是为什么我会尝试用一个更简单的例子来解释。(我还将在括号中包含我的案例,以明确我需要解决此问题的原因) 正如你所看到的,随机数产生了两次 还有别的办法解决这个问题吗?如果是,怎么办?这是因为delayedRandomNumber是单播还是单播。每个订阅都有自己的生产者(在您的情况下,Observable.fromCallable中的随机数生成是生产者) 为了避免这个问题,您可以使用操作符多播delayedRandomNumber val delayedRandomN

很难解释我的问题,这就是为什么我会尝试用一个更简单的例子来解释。(我还将在括号中包含我的案例,以明确我需要解决此问题的原因)

正如你所看到的,随机数产生了两次


还有别的办法解决这个问题吗?如果是,怎么办?

这是因为
delayedRandomNumber
是单播还是单播。每个订阅都有自己的生产者(在您的情况下,Observable.fromCallable中的随机数生成是生产者)

为了避免这个问题,您可以使用操作符多播
delayedRandomNumber

    val delayedRandomNumber =
        Observable.fromCallable {
            val randomNumber = Random().nextInt()
            Log.d("LogTag", "random number = $randomNumber")
            randomNumber
        }.delay(5000, TimeUnit.MILLISECONDS)
         .share()
输出

random number = -942235082
result=-942235082
-942235082 mod 1 = 0
result=-942235082
-942235082 mod 2 = 0
result=-942235082
-942235082 mod 3 = -2

请阅读太多,因为我发现它有帮助时,与多播观测问题

这是因为
delayedRandomNumber
是单播或单播。每个订阅都有自己的生产者(在您的情况下,Observable.fromCallable中的随机数生成是生产者)

为了避免这个问题,您可以使用操作符多播
delayedRandomNumber

    val delayedRandomNumber =
        Observable.fromCallable {
            val randomNumber = Random().nextInt()
            Log.d("LogTag", "random number = $randomNumber")
            randomNumber
        }.delay(5000, TimeUnit.MILLISECONDS)
         .share()
输出

random number = -942235082
result=-942235082
-942235082 mod 1 = 0
result=-942235082
-942235082 mod 2 = 0
result=-942235082
-942235082 mod 3 = -2
请阅读太多,因为我发现它有帮助时,与多播观测问题