我的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
,但无法按照我的意愿将它们组合起来。
答案 0 :(得分:1)
./emulator -list-avds
运算符适用于您的用例,但第二个observable应该在创建后立即开始存储点击事件,以便在订阅observable时发出存储的事件(这发生在{ {1}}完成)。这可以通过使用concatWith
和initLoading
修改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。 “结果加载”总是相同的,但