synchronized listeners to prevent crashs

This commit is contained in:
Gonk
2020-02-29 20:22:49 +01:00
parent 03584ecf93
commit c3def649bc

View File

@@ -8,7 +8,7 @@ import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
public class ListOfListeners<T> {
private final ArrayList<WeakReference<T>> listeners = new ArrayList<WeakReference<T>>();
public final void add(T listener) {
public synchronized final void add(T listener) {
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
for (WeakReference<T> ref : listeners) {
if (ref.get() == listener) {
@@ -18,7 +18,7 @@ public class ListOfListeners<T> {
}
listeners.add(new WeakReference<T>(listener));
}
public final void remove(T listenerToRemove) {
public synchronized final void remove(T listenerToRemove) {
for (int i = listeners.size()-1; i >= 0; --i) {
T listener = listeners.get(i).get();
if (listener == null || listener == listenerToRemove) {
@@ -26,32 +26,32 @@ public class ListOfListeners<T> {
}
}
}
public final void clear() {
public synchronized final void clear() {
listeners.clear();
}
protected final void callAllListeners(Function<T> e) {
protected synchronized final void callAllListeners(Function<T> e) {
for (int i = listeners.size()-1; i >= 0; --i) {
T listener = listeners.get(i).get();
if (listener == null) listeners.remove(i);
else e.call(listener);
}
}
protected final <Arg1> void callAllListeners(Function1<T, Arg1> e, Arg1 arg) {
protected synchronized final <Arg1> void callAllListeners(Function1<T, Arg1> e, Arg1 arg) {
for (int i = listeners.size()-1; i >= 0; --i) {
T listener = listeners.get(i).get();
if (listener == null) listeners.remove(i);
else e.call(listener, arg);
}
}
protected final <Arg1, Arg2> void callAllListeners(Function2<T, Arg1, Arg2> e, Arg1 arg1, Arg2 arg2) {
protected synchronized final <Arg1, Arg2> void callAllListeners(Function2<T, Arg1, Arg2> e, Arg1 arg1, Arg2 arg2) {
for (int i = listeners.size()-1; i >= 0; --i) {
T listener = listeners.get(i).get();
if (listener == null) listeners.remove(i);
else e.call(listener, arg1, arg2);
}
}
protected final <Arg1, Arg2, Arg3> void callAllListeners(Function3<T, Arg1, Arg2, Arg3> e, Arg1 arg1, Arg2 arg2, Arg3 arg3) {
protected synchronized final <Arg1, Arg2, Arg3> void callAllListeners(Function3<T, Arg1, Arg2, Arg3> e, Arg1 arg1, Arg2 arg2, Arg3 arg3) {
for (int i = listeners.size()-1; i >= 0; --i) {
T listener = listeners.get(i).get();
if (listener == null) listeners.remove(i);