我将更多地使用RxJava和ReactFX,但我想要了解的是如何协调这两者,因为ReactFX没有RxJava依赖关系,那么两者如何在同一个monad中相互交谈呢?特别是在JavaFX的ObservableValue
,RxJava的Observable
和ReactFX的StreamEvent
之间进行桥接而没有大量的样板。
我想用RxJava构建我的核心业务逻辑,因为他们不会一直支持JavaFX应用程序。但我希望JavaFX UI使用ReactFX
并使用EventStream
。所以我的问题是将EventStream
转换为Observable
,将Observable
转换为EventStream
,Binding
或{{}的最有效方法是什么? 1}?我知道我可以全面使用RxJava,但我想利用ReactFX的平台线程安全性和便利性......
ObservableValue
答案 0 :(得分:3)
将ReactFX EventStream
转换为RxJava Observable
:
Observable<Foo> toRx(EventStream<Foo> es) {
PublishSubject<Foo> sub = PublishSubject.create();
es.subscribe(sub::onNext);
return sub;
}
将RxJava Observable
转换为ReactFX EventStream
:
EventStream<Foo> fromRx(Observable<Foo> obs) {
EventSource<Foo> es = new EventSource<>();
obs.subscribe(foo -> Platform.runLater(() -> es.push(foo)));
return es;
}
在后一种情况下注意Platform.runLater(...)
。这会在JavaFX应用程序线程上生成EventStream
个发出事件。
另请注意,我们忽略了两种情况下从Subscription
方法返回的subscribe
。如果要在应用程序的生命周期内建立绑定,这很好。另一方面,如果它们之间的绑定应该是短暂的,在第一种情况下,您将使您的RxJava组件公开Subject
,您的ReactFX组件公开EventStream
,然后执行必要时subscribe
/ unsubscribe
。第二种情况也是如此。
答案 1 :(得分:2)
我不熟悉ReactFX,但是看看API我可以推断出这些转换:
public static <T> Observable<T> toObservable(EventStream<? extends T> es) {
return Observable.create(child -> {
Subscription s = es.subscribe(child::onNext);
child.add(Subscriptions.create(s::unsubscribe));
});
}
public static <T> EventStream<T> toEventStream(Observable<? extends T> o) {
return new EventStream<T>() {
final Vector<Consumer<? super T>> observers = new Vector<>();
@Override
public void addObserver(Consumer<? super T> observer) {
observers.add(observer);
}
@Override
public void removeObserver(Consumer<? super T> observer) {
observers.remove(observer);
}
@Override
public Subscription subscribe(Consumer<? super T> subscriber) {
addObserver(subscriber);
rx.Subscriber<T> s = new rx.Subscriber<T>() {
@Override
public void onNext(T t) {
subscriber.accept(t);
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
removeObserver(subscriber);
}
@Override
public void onCompleted() {
removeObserver(subscriber);
}
};
o.subscribe(s);
return () -> {
s.unsubscribe();
removeObserver(subscriber);
};
}
};
}
两者都应该给你取消订阅功能,虽然ReactFX不支持同步取消订阅,但我真的不知道EventStream是否可以用作hot或cold observable。我无法访问Binding,所以无法帮助你。