我基于TableCell编写了我的TableCell实现。我使用的是ChangeListener,但它不是垃圾回收。在这种情况下如何使用WeakChangeListener。请看我的代码。如何将其切换到WeakChangeListener。
changeListener = new ChangeListener<Object[]>() {
@Override
public void changed(ObservableValue<? extends Object[]> observable, Object[] oldValue, Object[] newValue) {
if (newValue != null && oldValue != null) {
if (oldValue[21].equals(newValue[21])) {
if (newValue[updateBasedValues] != null) {
if (!newValue[updateBasedValues].equals(oldValue[updateBasedValues])) {
justUpdated = true;
}
}
}
}
}
};
itemProperty().addListener(changeListener);
答案 0 :(得分:2)
您需要保留对弱侦听器的引用,以便不会过早收集垃圾。 在oracle论坛上阅读这个非常好的讨论:https://community.oracle.com/thread/2396063
我写了一个适配器类&#34; WeakAdapter&#34;你可以使用或扩展。 关于如何使用此类的示例: 而不是写
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());
}
}