Search code examples
androidcallbackevent-bus

EventBus vs Callbacks, which to use when?


I have many Activities which raise background tasks; the Activities will pass themselves in as having implemented a listener callback, so that the background tasks can raise an event on the Activities. The Activities in turn can show something on the UI to indicate that a background activity passed or failed.

Alternatively, I could use an EventBus, wherein I get the Activity to register itself as a listener/subscriber. I can have a background tasks raise an event on the EventBus and the Activity listening to it can handle it.

What are the advantages of one over the other? When would you use one over the other? (Code cleanliness? Performance? Caveats?)


Follow up - I did end up using EventBus. The code is definitely a lot cleaner and there aren't callbacks hanging out everywhere. The IDE (IntelliJ) thinks that the onEvent methods are unused, so I created an annotation

@Target({ElementType.METHOD})
public @interface EventBusHook {}

and placed it over my onEvent methods. Then Alt+Clicked on it and asked IntelliJ to not treat it as unused.

@EventBusHook
public void onEvent(MyEventType myEventType){

Solution

  • Benefits of using EventBus:

    • Your code will look much more clean
    • Your code will become more modular which will allow you to easily create test case for your code
    • Avoid memory leaks from bad object references which lock the object and does not allow Garbage Collector to clean it up
    • Could have more than one receiver a time, that it much like broadcasting
    • Simplify multiple interfaces into a single one, EventBus
    • In an interface class, you need to override every single method in the class that is inherited. With EventBus, you can listen for just an event that you really want

    But bad part is you might be a little bit more headache with the function declaration since IDE couldn't help you with auto-complete.

    My suggestion is, if you find that you have to create a custom listener, then please consider EventBus, it might be a better choice for most of (if not all) of your requirements/cases.

    Anyway, it is all your choice after all =)