在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/observeOn
和timer
之间放置flatMap
。它是否正确?这里到底发生了什么,我做错了什么?
通话结束后Observable
会发生什么?它会保持活着还是我需要以某种方式明确地撕下它,例如致电OnCompleted()
?
答案 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}}将在发出其唯一项目后完成。
请注意,如果您在Observables
或Fragment
内使用Activity
,则应始终确保unsubscribe
来自Observables
消除内存泄漏的可能性。