我正在使用一个应用程序,我已经实现了观察者模式,它将在模型中更改滑块值。 我有一个名为clear的按钮,它将清除窗口并在删除监听器之前将观察者设置为null。所以在此之后我使用探查器进行了内存映射。但我害怕发现对象仍在那里。 在我的第二个exp中,在使观察者为null之前,我首先删除所有的侦听器,然后将其设为null,并且我从分析器中发现该对象现在由垃圾收集器收集。 下面我提供了此代码的片段。很高兴看到这一点。
controls = new Createcontrols();
Scene scene = new Scene(new Group());
stage.setTitle("Table View Sample");
stage.setWidth(300);
stage.setHeight(500);
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
controlbox = controls.creatControls();
vbox.getChildren().add(controlbox);
final Button clear = new Button("clear");
vbox.getChildren().add(clear);
EventHandler deletehnadler= new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent arg0) {
// TODO Auto-generated method stub
vbox.getChildren().clear();
// controls.dispose();
controls=null;
}
};
Createcontrol class:
package com.nxp.designpattern.observer;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.Slider;
import javafx.scene.layout.VBox;
public class Createcontrols implements ObserverInterface {
private Slider slider;
private static int counter;
private Subject m_subject;
private Button next_button;
private Button previous_buttButton;
private EventHandler<ActionEvent> nexteventhandler;
private EventHandler<ActionEvent> prevhandler;
public Createcontrols() {
m_subject = new Subject();
ObserverImpl.getObserverImpl().addListener(this);
}
public VBox creatControls() {
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
next_button = new Button("next");
previous_buttButton = new Button("Previous");
slider = new Slider();
vbox.getChildren().add(next_button);
vbox.getChildren().add(previous_buttButton);
vbox.getChildren().add(slider);
nexteventhandler = new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
// TODO Auto-generated method stub
counter += 10;
m_subject.setValue(counter);
}
};
next_button.addEventHandler(ActionEvent.ACTION, nexteventhandler);
prevhandler = new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
// TODO Auto-generated method stub
counter -= 10;
m_subject.setValue(counter);
}
};
previous_buttButton.addEventHandler(ActionEvent.ACTION, prevhandler);
return vbox;
}
@Override
public void changeinvalue(int value) {
slider.setValue(value);
}
void dispose() {
next_button.removeEventHandler(ActionEvent.ACTION, nexteventhandler);
// nexteventhandler=null;
previous_buttButton.removeEventHandler(ActionEvent.ACTION, prevhandler);
// prevhandler=null;
ObserverImpl.getObserverImpl().removeListener(this);
}
}
答案 0 :(得分:1)
“在我的第二个exp中,在使观察者为null之前,我先删除所有的侦听器,然后将其设为null” 这是问题/解决方案。变量只是一个指针,将其设置为null不会对实际对象执行任何操作,并且侦听器仍然具有引用,因此它永远不会被垃圾回收。您必须删除所有引用。