从经典 Java 事件模式创建 Rx-Java Observable
的最佳方法是什么?也就是说,给定
class FooEvent { ... }
interface FooListener {
void fooHappened(FooEvent arg);
}
class Bar {
public void addFooListener(FooListener l);
public void removeFooListener(FooListener l);
}
我要实现
Observable<FooEvent> fooEvents(Bar bar);
我想出的实现是:
Observable<FooEvent> fooEvents(Bar bar) {
return Observable.create(new OnSubscribeFunc<FooEvent>() {
public Subscription onSubscribe(Observer<? super FooEvent> obs) {
FooListener l = new FooListener() {
public void fooHappened(FooEvent arg) {
obs.onNext(arg);
}
};
bar.addFooListener(l);
return new Subscription() {
public void unsubscribe() {
bar.removeFooListener(l);
}
};
}
});
}
不过,我不是很喜欢:
很冗长;
每个
Observer
都需要一个监听器(理想情况下,如果没有观察者,则应该没有监听器,否则只有一个监听器)。这可以通过将观察者计数保留为OnSubscribeFunc
中的一个字段,在订阅时递增,在取消订阅时递减。
有没有更好的解决方案?
要求:
使用现有的事件模式实现而不更改它们(如果我正在控制该代码,我已经可以编写它以返回我需要的
Observable
)。如果/当源 API 更改时会出现编译器错误。不能使用
Object
而不是实际的事件参数类型或属性名称字符串。
最佳答案
我认为没有办法为每个可能的事件创建一个通用的 observable,但您当然可以在任何需要的地方使用它们。
RxJava 源代码有一些方便的示例,说明如何从鼠标事件、按钮事件等创建可观察对象。看看这个类,它从 KeyEvents 创建它们:KeyEventSource.java .
关于java - 从普通 Java 事件创建 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20552598/