您需要保留對弱偵聽程序的引用,以免過早收集垃圾。 在oracle論壇上閱讀這個非常好的討論:https://community.oracle.com/thread/2396063
我寫了一個可以使用或擴展的適配器類「WeakAdapter」。 示例如何你這個類: 而是寫作的
myBooleanProperty.addListener(new ChangeListener<Boolean>() {...});
使用:
weak = new WeakAdapter();
weak.addChangeListener(myBooleanProperty, new ChangeListener<Boolean>(){});
這裏是類WeakAdapter的代碼: 公共類WeakAdapter {
ArrayList<Object> listenerRefs = new ArrayList<>();
public WeakAdapter() {
}
public void dipose() {
listenerRefs.clear();
}
public final <T> void remove(ChangeListener<T> listener) {
listenerRefs.remove(listener);
}
public final <T> void addChangeListener(final ObservableValue observable, ChangeListener<T> listener) {
listenerRefs.add(listener);
observable.addListener(new WeakChangeListener<>(listener));
}
public final <T> WeakListChangeListener<T> addListChangeListener(ListChangeListener<T> listener) {
listenerRefs.add(listener);
return new WeakListChangeListener<>(listener);
}
public void addInvalidationListener(final Observable listened, InvalidationListener listener) {
listenerRefs.add(listener);
listened.addListener(new WeakInvalidationListener(listener));
}
public final void stringBind(final StringProperty propertyToUpdate, final StringExpression expressionToListen) {
ChangeListener<String> listener = new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> ov, String t, String name) {
propertyToUpdate.set(name);
}
};
listenerRefs.add(listener);
expressionToListen.addListener(new WeakChangeListener<>(listener));
listener.changed(null, null, expressionToListen.get());
}
public final void booleanBind(final BooleanProperty propertyToUpdate, final BooleanExpression expressionToListen) {
ChangeListener<Boolean> listener = new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean name) {
propertyToUpdate.set(name);
}
};
listenerRefs.add(listener);
expressionToListen.addListener(new WeakChangeListener<>(listener));
propertyToUpdate.set(expressionToListen.get());
}
}
公衆面對這兩個對象的API似乎幾乎是相同的。你確定一個簡單的查找和替換是不夠的嗎? –
你是什麼意思查找和替換,我試圖刪除監聽器在最終功能,它不適合我嗎? :/ – kingkong