我想开始替换/使用RXJava2进行轮询而不是Observer和Listeners。现在只有一个问题。只有一个Polling Observable,只有在连接了至少一个用户的情况下才能启动。如果连接了多个订户,则Interval应该相同。意思是:一个可观察者在所有n秒内重复轮询过程。如果observable有1 .. *订阅者,它应该保持轮询n秒并通知所有订阅者结果。
这是我用Listeners和/或我的RXJava解决方案完成的。
我的第一个尝试是创建一个Singleton类,它只创建一个PublishSubject。如果有人订阅,它将获取onNext()中的数据。现在我的Polling Observer在某个地方启动并将数据推送到主题。这不起作用,因为它是
不会成功共享数据,需要两个类(主题和重复观察)
public class SingleTonClass {
private PublishSubject<List<Data>> subject = PublishSubject.create();
public PublishSubject getSubject() {
return this.subject;
}
public void setData(List<Data> data) {
subject.onNext(data);
}
}
我很可爱避免使用Listener / Interfaces来共享信息,让rxjava2完成它的工作。
经过研究后我发现有refcount()和share(),但我不确定这是否是解决这个问题的正确方法。在我的情况下,它是一个REST服务,它轮询服务器,如果至少有一个订户连接,否则它应该停止轮询,因为在这种情况下获取数据是没有意义的。
我试图解决它的问题,但它不起作用例外:
答案 0 :(得分:0)
我会这样做:
Observable<Data> dataSource = Observable.interval(INTERVAL, TIME_UNIT)
.observeOn(Schedulers.io()) // make REST requests on IO threads
.map(n -> {
return requestData();
})
.replay(1);
replay()
运算符包含share()
,其中包含publish()
和refCount()
功能。这使您的可观察热,即所有订阅者共享单个订阅。它会自动为第一个订阅者订阅(启动新的interval
序列),并在最后一个订阅者离开时取消订阅(停止interval
)。
replay(1)
也会缓存最后一次发布的值,即新订阅者不必等待新数据到达。