RXJava 2与多个订阅者进行轮询

时间:2017-04-06 12:02:54

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

我想开始替换/使用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服务,它轮询服务器,如果至少有一个订户连接,否则它应该停止轮询,因为在这种情况下获取数据是没有意义的。

我试图解决它的问题,但它不起作用例外:

Polling using RXJava2 / RXAndroid 2 and Retrofit

1 个答案:

答案 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)也会缓存最后一次发布的值,即新订阅者不必等待新数据到达。