eventbus: Subbing twice shouldn't be possible

This commit is contained in:
Owain van Brakel
2019-07-27 20:24:36 +02:00
parent 207c65c325
commit f7f539e245

View File

@@ -17,6 +17,7 @@ import org.apache.commons.lang3.exception.ExceptionUtils;
@Singleton @Singleton
public class EventBus implements EventBusInterface public class EventBus implements EventBusInterface
{ {
private Map<Object, Object> subscriptionList = new HashMap<>();
private Map<Class<?>, Relay<Object>> subjectList = new HashMap<>(); private Map<Class<?>, Relay<Object>> subjectList = new HashMap<>();
private Map<Object, CompositeDisposable> subscriptionsMap = new HashMap<>(); private Map<Object, CompositeDisposable> subscriptionsMap = new HashMap<>();
@@ -43,6 +44,11 @@ public class EventBus implements EventBusInterface
// Subscribe on lifecycle (for example from plugin startUp -> shutdown) // Subscribe on lifecycle (for example from plugin startUp -> shutdown)
public <T> void subscribe(Class<T> eventClass, @NonNull Object lifecycle, @NonNull Consumer<T> action) public <T> void subscribe(Class<T> eventClass, @NonNull Object lifecycle, @NonNull Consumer<T> action)
{ {
if (subscriptionList.containsKey(lifecycle) && eventClass.equals(subscriptionList.get(lifecycle)))
{
return;
}
Disposable disposable = getSubject(eventClass) Disposable disposable = getSubject(eventClass)
.filter(Objects::nonNull) // Filter out null objects, better safe than sorry .filter(Objects::nonNull) // Filter out null objects, better safe than sorry
.cast(eventClass) // Cast it for easier usage .cast(eventClass) // Cast it for easier usage
@@ -53,6 +59,7 @@ public class EventBus implements EventBusInterface
}); });
getCompositeDisposable(lifecycle).add(disposable); getCompositeDisposable(lifecycle).add(disposable);
subscriptionList.put(lifecycle, eventClass);
} }
@Override @Override
@@ -60,6 +67,7 @@ public class EventBus implements EventBusInterface
{ {
//We have to remove the composition from the map, because once you dispose it can't be used anymore //We have to remove the composition from the map, because once you dispose it can't be used anymore
CompositeDisposable compositeDisposable = subscriptionsMap.remove(lifecycle); CompositeDisposable compositeDisposable = subscriptionsMap.remove(lifecycle);
subscriptionList.remove(lifecycle);
if (compositeDisposable != null) if (compositeDisposable != null)
{ {
compositeDisposable.dispose(); compositeDisposable.dispose();