如何在时间间隔中使用自定义类作为Observable和fire方法

时间:2013-12-13 11:11:48

标签: java observable rx-java

我有一个班级Producer,简化了方法public Object readData() 我想将此课程设为ObservableRxJava)。

如何指出应该调用哪种方法?我是否需要将Producer班级转换为FutureIterable

下一个问题是readData应该每n秒调用 。 某些方法(例如from)具有调度程序参数,但我找不到任何示例如何应用它。 我找到了interval方法,但它发出了一系列整数。 到目前为止,没有Observable我使用Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(....)

2 个答案:

答案 0 :(得分:3)

您仍然可以使用interval()方法,只需忽略其结果!

final Producer producer = ...;
int n = ...;
Observable<Object> obs = 
    Observable.interval(n,TimeUnit.SECONDS)
              .map(new Func1<Integer,Object>() {
                  @Override
                  public Object call(Integer i) {
                      return producer.readData();
                  }
               ));

答案 1 :(得分:1)

我是RxJava的新手,但是没有其他人回答你的问题,所以这里有一个问题。

我的建议是让你的Producer类实现接口Observable.OnSubscribeFuncJavadoc)。在方法public Subscription onSubscribe(Observer<T> observer)中,您可以调用Producer#readData()方法获取当前可用的数据,并将该数据传递到onNext()方法,如下所示:

// Make sure to change T as appropriate
public class Producer implements OnSubscribeFunc<T> {
    . . . 

    @Override
    public Subscription onSubscribe(Observer<T> observer) {
        while (this.hasData()) {
            observer.onNext(this.readData());
        observer.onCompleted();
    }
}

(这假设您的Producer#readData()方法以块的形式返回数据,而不是一次性返回数据。根据需要进行调整。)

然后,您可以使用Observable#create(OnSubscribeFunc<T>)方法订阅Producer对象,并安排在计时器上使用Observable返回元素:

// In your observer class
Observable<T> myProducer = Observable.create(new Producer(...));

ScheduledExecutorService scheduler = 
        Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(....);
Observable<T> myProducerTimed = myProducer.subscribeOn(Schedulers.executor(scheduler));
// Now use myProducerTimed

我现在无法测试最后两行。对不起,如果有变化,我会调查并更新我的答案。

免责声明:我是一个RxJava n00b,所以这个解决方案可能很糟糕,或者可能是不必要的混乱。修复看似错误的内容。

更新:我在使用RxJava时遇到了问题(RxJava -- Terminating Infinite Streams);看起来我的解决方案看起来很像你的(使用Scheduler定期生成Observable返回元素)。