【问题标题】:Observable.zip with Observable.timer带有 Observable.timer 的 Observable.zip
【发布时间】:2016-09-26 07:09:07
【问题描述】:

我正在尝试压缩两个 observables,在本例中是一个计时器任务和一个实际任务,以便我的订阅者只有在两个任务都完成时才会被调用。我想用Observable.zip 来做这件事,但不知何故这不起作用,我的Observable.timer 没有调用onComplete()。这意味着订阅者永远不会得到Observables 的结果。

当我突然将zip 更改为merge 时,Observable.timer 确实调用了onComplete(),我在这里缺少什么?

Observable<Long> delayObs = Observable.timer(500, TimeUnit.MILLISECONDS);
Observable<Void> methodObs = method();

mSubscription = Observable.zip(delayObs, methodObs, (pLong, pVoid) -> pVoid)
                              .subscribeOn(Schedulers.io())
                              .observeOn(AndroidSchedulers.mainThread())
                              .subscribe(__ -> thisDoesntGetCalled(), throwable -> M2Log.e(LOG_TAG,
                                      "error", throwable));

方法:

private Observable<Void> method() {
    return Observable.defer(() -> {
        // some work
        return Observable.empty();
    });
}

我错过了什么吗?

【问题讨论】:

  • Zip 合并了值,但你的 method() 的 Observable 没有发出任何东西,因此 zip 决定它永远无法合并任何东西然后完成。
  • 谢谢!这实际上是有道理的。如果您将此作为答案发布,我会接受。

标签: java android rx-java observable rx-android


【解决方案1】:

Zip 合并值,但您的 method() 的 Observable 不发出任何内容,因此 zip 决定它永远无法合并任何内容然后完成。

您可以将方法更改为此,现在 zip 确实会调用您提供的函数:

private Observable<Integer> method() {
    return Observable.defer(() -> {
        // some work
        return Observable.just(1);
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    相关资源
    最近更新 更多