我有一个班级Producer
,简化了方法public Object readData()
我想将此课程设为Observable
(RxJava)。
如何指出应该调用哪种方法?我是否需要将Producer
班级转换为Future
或Iterable
?
下一个问题是readData
应该每n秒调用 。
某些方法(例如from)具有调度程序参数,但我找不到任何示例如何应用它。
我找到了interval方法,但它发出了一系列整数。
到目前为止,没有Observable我使用Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(....)
答案 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.OnSubscribeFunc
(Javadoc)。在方法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返回元素)。