为什么我的计时器Observable从未调用过?

时间:2014-10-04 21:30:10

标签: android rx-java

在Android上,我写了一个Observable,应该在2000毫秒后调用一次,但是从不调用它。

    Observable.timer(2000, TimeUnit.MILLISECONDS) // wait 2000 msec
            .subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
            .flatMap(new Func1<Long, Observable<?>>() {

        @Override public Observable<?> call(Long aLong) {
            continuePlayback(); // this line is never called
            return null;
        }

    });

我希望Observable等待主线程,然后在主线程上调用continuePlayback()。上下文帮助允许我在subscribeOn/observeOntimer之间放置flatMap。它是否正确?这里到底发生了什么,我做错了什么?

通话结束后Observable会发生什么?它会保持活着还是我需要以某种方式明确地撕下它,例如致电OnCompleted()

1 个答案:

答案 0 :(得分:3)

默认情况下,大多数Obsersables都是被动的,如果订阅,它们只会发出项目。在您的代码示例中,您未订阅Observable。因此,它实际上从未开始发射物品,或者在这种情况下是2000毫秒后的唯一物品。

flatMap只是Operator来帮助操纵数据流,但它不会订阅您的Observables流。

不应使用flatMap,而应使用subscribe调用替换它。

Observable.timer(2000, TimeUnit.MILLISECONDS)
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1<Long>() {
        @Override
        public void call(Long aLong) {
            continuePlayback();
        }
    });

我在Action中使用了Observer而不是subscribe,因为我不相信你需要在这个特定的onError处理Observable情况下。

来自timer的{​​{1}}将在发出其唯一项目后完成。

请注意,如果您在ObservablesFragment内使用Activity,则应始终确保unsubscribe来自Observables消除内存泄漏的可能性。

这是Hot and Cold Observables in RxJava

的快速链接