I've been playing around with Facebook's Flux architecture and RxJava lately and I wanted an event bus to use as the Dispatcher. Here is what I ended up with:

public final class RxEventBus { private final Subject<Object, Object> bus = new SerializedSubject<>(PublishSubject.create()); public void post(Object o) { bus.onNext(o); } public <T> Observable<T> events(Class<T> klass) { return events().ofType(klass); } public Observable<Object> events() { return bus.asObservable(); } }

Now we get all the RxJava goodness with our eventbus implementation. Delicious.

Usage

To subscribe to events of a certain class just pass the class in:

rxEventBus.events(Profile.class) .subscribe(profile -> doSomethingWithProfile(profile));

Because our event bus is built on RxJava we can take advantage of the composability provided by RxJava . This could allow us to do more complex tasks like calculate rolling averages (using Observable.window() ) or combine events ( Observable.combineLatest() , Observable.zip() , etc).

rxEventBus.events(Profile.class) .map(profile -> profile.name()) .subscribe(name -> print(name));

Often it's useful to be able to log what is going through the event bus, you can do this by subscribing to the events() Observable.

rxEventBus.events() .subscribe(event -> Log.i(TAG, event.toString());

See