【发布时间】:2018-12-29 09:17:14
【问题描述】:
我有一个用例,我想将多个ObservableValues 绑定到一个Observable,因为我实际上不感兴趣,值变化是什么,我只需要一种在变化时得到通知的方法。
所以这是 Observable 绑定,我想出了:
BooleanBinding() {
{
super.bind(proxy.activeShipProperty());
INavigableVessel activeShip = proxy.getActiveShip();
super.bind(activeShip.getLoadBinding());
if (activeShip instanceof IShip) {
super.bind(((IShip) activeShip).travelState());
} else {
super.bind(((IConvoy) activeShip).getOrlegShip().travelState());
}
super.bind(date.dayDateBinding());
}
private boolean value = true;
@Override
protected boolean computeValue() {
value = !value;
return value;
}
};
然后是这个测试代码,以验证它是否按预期工作:
Observable observable = contentProvider.createObservable(ENoticeBoardType.SHIP_WARE_INFO, proxy);
IntegerProperty invalidationCounter = new SimpleIntegerProperty(0);
InvalidationListener listener = observable1 -> invalidationCounter.setValue(invalidationCounter.get() + 1);
observable.addListener(listener);
// When
dayBinding.invalidate();
loadBinding.invalidate();
travelState.set(EShipTravelState.ANCHOR);
activeVessel.set(mock(IShip.class));
// Then
assertEquals(4, invalidationCounter.get());
事实证明不是。 invalidationCounter 仅在第一次 invalidate 调用时增加一次。
但是,当我将上面的 BooleanBinding 处理为 ObservableValue 时,我可以添加一个 ChangeListener:
ChangeListener listener = (obs, oldValue, newValue) -> invalidationCounter.setValue(invalidationCounter.get() + 1);
observable.addListener(listener);
// When
dayBinding.invalidate();
loadBinding.invalidate();
travelState.set(EShipTravelState.ANCHOR);
activeVessel.set(mock(IShip.class));
// Then
assertEquals(4, invalidationCounter.get());
这按预期工作。
我想知道/已经确认: InvalidationListener 只被调用一次,当Observable 变为无效时,它不会变回有效,因此它可以再次变为有效。但是,使用 ChangeListener 会强制计算新值,因此 ObservableValue 再次变为有效。
基于这一观察,是否有任何用例可以让我真正使用Observable?
【问题讨论】: