Для чего нужна библиотека EventBus или её аналог Otto?

1,00
р.
Просмотрел много ссылок в Google, но все равно не получил конкретного ответа: какую задачу решает библиотека Greenrobot EventBus (или её аналоги — Square Otto), чем она лучше стандартных вариантов и насколько она оправдывает свое использование?

Последний вопрос возникает из-за того, что я не представляю такую архитектуру, построенную на событиях. В MVP\RxJava библиотека совсем не вписывается (как минимум, у себя в проектах я не видел мест для их использования), разве что имеет смысл использовать библиотеку в общении между Service и другими частями приложения.

Ответ
Если отвлечься от всяких мудреных терминов, вроде событийно-ориентированного программирования, то данная библиотека служит для организации коммуникаций (обмена данными и событиями) между не связанными частями приложения. То есть, данная библиотека позволяет самым простым образом отправить произвольные данные из одной части приложения (например активити), в другую (например фрагмент). Работа основана на регистрации приемника события и затем отправки каких то событий "в эфир". Нужный приемник получит свой сигнал и вы можете принять отправленные данные. Пример:
Сначала создается класс-модель с конструкторами инициализации, которая будет хранить в себе передаваемые данные:
public class MessageEvent { public final String message
public MessageEvent(String message) { this.message = message } }
здесь класс-модель MessageEvent с одним полем данных типа String и конструктор инициализации этих данных. Вы можете создать произвольное количество полей данных произвольных объектов, а конструкторы инициализации могут включать несколько аргументов.
Затем в классе (например активити) из которого необходимо передать наши данные создается событие:
EventBus.getDefault().post(new MessageEvent("Hello everyone!"))
В классе, куда мы желаем отправить наши данные (например фрагмент) мы регистрируем приемник события:
@Override public void onStart() { super.onStart() // регистрация приемника при старте фрагмента EventBus.getDefault().register(this) }
@Override public void onStop() { // отписываемся от регистрации при закрытии фрагмента EventBus.getDefault().unregister(this) super.onStop() }
// В этом методе-колбэке мы получаем наши данные // (объект `event` типа класса-модели MessageEvent) public void onEvent(MessageEvent event){ // извлекаем из модели отправленную строку: event.message = "Hello everyone!" Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show() }
Как только в активити будет выполнен код отправки события в колбэке onEvent() фрагмента появятся отправленные данные. Получат эти данные только те приемники, у которых в колбэке совпадет сигнатура с отправленным событием. Помимо классов-моделей можно передавать и простые типы данных, например:
Отправка:
int num = 5 EventBus.getDefault().post(num)
Получение (регистрация приемника опущена):
public void onEvent(int event){ Toast.makeText(getActivity(), "Получено число:" + event, Toast.LENGTH_SHORT).show() }
Вообще, не важно, что вы шлете по шине: классы-модели сложной структуры, объекты, коллекции , массивы или примитивные типы - все это будет в целости доставлено получателю.
От инструментов обмена данными, которые реализует сама система Android, данное решение выгодно отличает простота и прозрачность использования, отсутствие какой либо связи между отправителем и получателем и возможность передавать данные любого типа и в любых количествах без всякой парцелибизации или сериализации.
Библиотека так же позволяет отправлять "липкие" события (не будут пропадать, пока не отправятся другие данные, например, при передаче между двумя активити, когда в момент передачи события приемника еще не существует, данные будут получены, когда получатель появится), работать с асинхронными потоками и тд. Смотрите документацию для подробностей.
Так же есть другие библиотеки аналогичной функциональности, например Square Otto. Кроме того, шагнувшая намного дальше концепция реактивного программирования - фреймворк rxJava и дополнения для Android - фреймворк rxAndroid, учитывающий специфику платформы.