Browse Source

Fix for issue #210 Possible memory leak

gilad4 3 years ago
parent
commit
bfe82840f6

+ 2 - 1
materialfx/src/main/java/io/github/palexdev/materialfx/utils/others/observables/OnChanged.java

@@ -21,6 +21,7 @@ package io.github.palexdev.materialfx.utils.others.observables;
 import javafx.beans.value.ChangeListener;
 import javafx.beans.value.ObservableValue;
 
+import java.lang.ref.WeakReference;
 import java.util.function.BiConsumer;
 
 /**
@@ -100,7 +101,7 @@ public class OnChanged<T> extends When<T> {
 		}
 
 		observableValue.addListener(listener);
-		whens.put(observableValue, this);
+        whens.put(observableValue, new WeakReference<>(this));
 		return this;
 	}
 

+ 2 - 1
materialfx/src/main/java/io/github/palexdev/materialfx/utils/others/observables/OnInvalidated.java

@@ -21,6 +21,7 @@ package io.github.palexdev.materialfx.utils.others.observables;
 import javafx.beans.InvalidationListener;
 import javafx.beans.value.ObservableValue;
 
+import java.lang.ref.WeakReference;
 import java.util.function.Consumer;
 
 /**
@@ -100,7 +101,7 @@ public class OnInvalidated<T> extends When<T> {
 		}
 
 		observableValue.addListener(listener);
-		whens.put(observableValue, this);
+		whens.put(observableValue, new WeakReference<>(this));
 		return this;
 	}
 

+ 7 - 5
materialfx/src/main/java/io/github/palexdev/materialfx/utils/others/observables/When.java

@@ -20,6 +20,7 @@ package io.github.palexdev.materialfx.utils.others.observables;
 
 import javafx.beans.value.ObservableValue;
 
+import java.lang.ref.WeakReference;
 import java.util.WeakHashMap;
 
 /**
@@ -42,7 +43,7 @@ public abstract class When<T> {
 	//================================================================================
 	// Properties
 	//================================================================================
-	protected static final WeakHashMap<ObservableValue<?>, When<?>> whens = new WeakHashMap<>();
+	protected static final WeakHashMap<ObservableValue<?>, WeakReference<When<?>>> whens = new WeakHashMap<>();
 	protected final ObservableValue<T> observableValue;
 	protected boolean oneShot = false;
 
@@ -103,8 +104,9 @@ public abstract class When<T> {
 	 * If a When constructs exists for the given {@link ObservableValue},
 	 * {@link #dispose()} is invoked.
 	 */
-	public static void disposeFor(ObservableValue<?> observableValue) {
-		When<?> remove = whens.remove(observableValue);
-		if (remove != null) remove.dispose();
-	}
+    public static void disposeFor(ObservableValue<?> observableValue) {
+        WeakReference<When<?>> removedRef = whens.remove(observableValue);
+        var remove = removedRef != null ? removedRef.get() : null;
+        if (remove != null) remove.dispose();
+    }
 }