带Observable.timer的Observable.zip

时间:2016-09-26 07:09:07

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

我正在尝试压缩两个observable,在这种情况下是一个计时器任务和一个实际任务,这样我的订阅者只有在完成这两个任务时才会被调用。我希望使用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();
    });
}

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

Zip结合了值但你的方法()的Observable没有发出任何东西,因此zip决定它不能组合任何东西然后完成。

您可以将方法更改为此,现在zip会调用您提供的功能:

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