diff --git a/runelite-client/src/main/java/net/runelite/client/eventbus/EventBus.java b/runelite-client/src/main/java/net/runelite/client/eventbus/EventBus.java index 97cb77c6d6..d68e93d341 100644 --- a/runelite-client/src/main/java/net/runelite/client/eventbus/EventBus.java +++ b/runelite-client/src/main/java/net/runelite/client/eventbus/EventBus.java @@ -8,10 +8,11 @@ import io.reactivex.disposables.Disposable; import io.reactivex.functions.Consumer; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import javax.inject.Singleton; @Singleton -public class EventBus +public class EventBus implements EventBusInterface { private Map, Relay> subjectList = new HashMap<>(); private Map subscriptionsMap = new HashMap<>(); @@ -35,12 +36,19 @@ public class EventBus return compositeDisposable; } - public void subscribe(Class eventClass, @NonNull Object lifecycle, @NonNull Consumer action) + @Override + // Subscribe on lifecycle (for example from plugin startUp -> shutdown) + public void subscribe(Class eventClass, @NonNull Object lifecycle, @NonNull Consumer action) { - Disposable disposable = getSubject(eventClass).subscribe(action); + Disposable disposable = getSubject(eventClass) + .filter(Objects::nonNull) // Filter out null objects, better safe than sorry + .cast(eventClass) // Cast it for easier usage + .subscribe(action); + getCompositeDisposable(lifecycle).add(disposable); } + @Override public void unregister(@NonNull Object lifecycle) { //We have to remove the composition from the map, because once you dispose it can't be used anymore @@ -51,6 +59,7 @@ public class EventBus } } + @Override public void post(Class eventClass, @NonNull Object event) { getSubject(eventClass).accept(event); diff --git a/runelite-client/src/main/java/net/runelite/client/eventbus/EventBusInterface.java b/runelite-client/src/main/java/net/runelite/client/eventbus/EventBusInterface.java new file mode 100644 index 0000000000..d0858562ef --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/eventbus/EventBusInterface.java @@ -0,0 +1,13 @@ +package net.runelite.client.eventbus; + +import io.reactivex.annotations.NonNull; +import io.reactivex.functions.Consumer; + +public interface EventBusInterface +{ + void subscribe(Class eventClass, @NonNull Object lifecycle, @NonNull Consumer action); + + void unregister(@NonNull Object lifecycle); + + void post(Class eventClass, @NonNull Object event); +}