RxJava2:不要在`repeatWhen`中重复

时间:2017-06-28 09:08:50

标签: java android rx-java reactive-programming rx-java2

我有一个Observable我想定期重复,但只是在一个条件下:

apiInterface.getData() // returns Observable<Data>
... // processing is happening here
.toList()
.repeatWhen(completed -> {
    if (autoReload){
        // Repeat every 3 seconds
        return completed.delay(3, TimeUnit.SECONDS);
    } else {
        return ??? // What do I have to return that it does not repeat?
    }
})
.subscribe(list -> callbackInterface.success(list));

我的问题是:我必须在else语句中返回什么才能不重复Observable(只执行一次链接)?

2 个答案:

答案 0 :(得分:5)

您必须对完成指示作出反应,表示完成以响应某个项目,例如:

completed.takeWhile(v -> false);

不幸的是,empty()在那里不起作用,因为它会在源甚至可以运行之前立即完成序列。

答案 1 :(得分:0)

这是Observable.empty()。如Javadoc文档中所述:

  

[..]如果Observable调用onCompleteonError,那么repeatWhen会在子订阅上调用onCompletedonError。否则,此Observable将重新订阅源可观察源。

完整的代码是:

apiInterface.getData() // returns Observable<Data>
... // processing is happening here
.toList()
.repeatWhen(completed -> {
    if (autoReload){
        // Repeat every 3 seconds
        return completed.delay(3, TimeUnit.SECONDS);
    } else {
        return Observable.empty()
    }
})
.subscribe(list -> callbackInterface.success(list));