RxJava:结合冷热观察等待彼此

时间:2018-01-23 09:35:22

标签: android rx-java rx-java2 rx-kotlin rx-kotlin2

我的observables定义如下

    val initLoading = Observable.fromCallable { println("${System.currentTimeMillis()}") }
            .subscribeOn(Schedulers.computation())
            .delay(WAIT_TIME, TimeUnit.SECONDS)
            .map { "loading ${System.currentTimeMillis()}" }
            .observeOn(AndroidSchedulers.mainThread())

    val click = RxView.clicks(button).map { "click ${System.currentTimeMillis()}" }
    initLoading.concatWith(click)
            .subscribeBy(
                    onNext = { println("result $it") },
                    onError = { throw it }
            )

initialLoading开始使用Activity的onCreate方法运行。点击按钮后执行click。我有两个案例,第一个是工作,第二个不是。

案例1

活动开始,点击按钮 WAIT_TIME秒后。输出:

   01-23 13:08:07.170  I/System.out: 1516698487170
   01-23 13:08:17.174  I/System.out: result loading 1516698497172
   01-23 13:08:29.258  I/System.out: result click 1516698509258

案例2

WAIT_TIME期结束之前,

活动开始并点击按钮。输出

   01-23 13:09:07.392 I/System.out: 1516698547392
   01-23 13:09:17.398 I/System.out: result loading 1516698557395

所以,问题是click事件丢失了。我希望click事件等待加载,然后继续工作。简而言之,案例2输出应与案例1相同。

我怎样才能使用rx运算符来解决这个问题。我尝试了merge,但它只是将两者结合在一起,点击事件并不等待加载。

我也试过了reply, cache, publish, share,但无法按照我的意愿将它们组合起来。

2 个答案:

答案 0 :(得分:1)

./emulator -list-avds 运算符适用于您的用例,但第二个observable应该在创建后立即开始存储点击事件,以便在订阅observable时发出存储的事件(这发生在{ {1}}完成)。这可以通过使用concatWithinitLoading修改click可观察量来实现。

replay()

现在,您可以在connect()中使用val replayedClicks = click.replay(); replayedClicks.connect(); // The original click observable is subscribed to at this point ,并在replayedClicks完成后重播其存储的事件:

concatWith

答案 1 :(得分:0)

尝试使用combineLatest而不是concatWith。 “结果加载”总是相同的,但