我将更加大量地使用RxJava和ReactFX,但是我想了解的是如何调和两者,因为ReactFX没有RxJava依赖关系,那么两者如何在同一个monad中彼此通信?在没有很多样板的情况下,在JavaFX的ObservableValue
,RxJava的Observable
和ReactFX的StreamEvent
之间架桥的情况尤其如此。
我想用RxJava构成我的核心业务逻辑,因为它们并不总是支持JavaFX应用程序。但是我希望JavaFX UI使用ReactFX
并利用EventStream
。所以我的问题是将EventStream
转换为Observable
并将Observable
转换为EventStream
,Binding
或ObservableValue
的最有效方法是什么?我知道我可以全盘使用RxJava,但我想利用ReactFX的Platform线程安全性和便利性...
//DESIRE 1- Turn EventStream into Observable in the same monad
Observable<Foo> obs = EventStream.valuesOf(fooObservableValue).toObservable();
//Desire 2- Turn Observable into ObservableValue, Eventstream, or Binding
Binding<Foo> obsVal = Observable.create(...).toBinding();
最佳答案
要将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(...)
。这使得结果EventStream
在JavaFX应用程序线程上发出事件。还要注意,在两种情况下,我们都忽略了
Subscription
方法返回的subscribe
。如果要在应用程序的生命周期内建立绑定,则可以。另一方面,如果它们之间的绑定是短暂的,则在第一种情况下,您将让RxJava组件公开Subject
,让ReactFX组件公开EventStream
,然后执行subscribe
/ unsubscribe
根据需要。对于第二种情况类似。