В чем разница между EventBus и RxJava?

Меня смущает разница между EventBus и RxJava в Android. Мне нужно реализовать один из них для моей проблемы с уведомлением некоторых компонентов, когда были сделаны некоторые изменения, чтобы они могли обновить свое состояние.
Кроме того, я читал, что EventsBus устарел по сравнению с RxJava, и я не знаю, если эта информация верна или нет.


person HiddenDroid    schedule 28.02.2016    source источник
comment
Насколько я знаю, они служат немного разным целям, но, в принципе, RxJava может гораздо больше, чем EventBus.   -  person OneCricketeer    schedule 28.02.2016
comment
Отто устарел, а GreenRobot — нет. greenrobot.org/eventbus   -  person Kuffs    schedule 28.02.2016
comment
Я проголосовал за повторное открытие этого вопроса, потому что на дублирующий вопрос, связанный с дубликатом, нет ответов, столь же ценных, как те, что здесь (единственный ответ, опубликованный там, касается только RxJava).   -  person Daniel F    schedule 20.12.2019
comment
@DanielF, ты тоже VTC другой как дурак?   -  person Tiago Martins Peres 李大仁    schedule 09.01.2020
comment
@TiagoMartinsPeres - Нет, не знал. Я бы хотел, если бы этот снова открыли.   -  person Daniel F    schedule 09.01.2020


Ответы (4)


EventBus и RxJava различны по своей природе.

EventBus — это всего лишь bus, как следует из названия — он обеспечивает механизм подписки и публикации событий в «шине», не заботясь о том, как выполняется подключение, что на самом деле представляет собой эта «шина» и т. д. В контексте Android EventBus - это просто более простой способ отправки и получения Broadcast сообщений с меньшим количеством шаблонов.

RxJava, с другой стороны, намного мощнее. Да, вы можете подписаться и публиковать события, но у вас гораздо больше контроля над процессом — частотой, в каком потоке все происходит и т. д. Основная сила RxJava (на мой взгляд) в том, что вы можете очень легко манипулировать публикуемыми данными. , используя некоторые из своих тонн operators.

Подводя итог - если вы заботитесь только о публикации некоторых событий и выполнении некоторых действий при получении - вам, вероятно, лучше использовать самый простой из двух, а именно какой-то Bus или даже старый добрый BroadcastReceivers. Если вы также выиграете от преобразования данных, обработки многопоточности или упрощенной обработки ошибок — используйте подход RxJava. Просто имейте в виду, что RxJava обычно имеет крутую кривую обучения, поэтому требуется некоторое время, чтобы привыкнуть к его концепции.

person Vesko    schedule 28.02.2016
comment
Спасибо за Ваш ответ. каковы недостатки использования EventBus? это ограничено по сравнению с RxJava? - person HiddenDroid; 29.02.2016
comment
@HiddenDroid Да, это так; вы могли бы просто использовать EventBus, но, на мой взгляд, RxJava может многое предложить своим операторам. RxJava набирает популярность (на самом деле не только RxJava, реактивное программирование в целом), и вы обнаружите, что многие библиотеки включают его в свои API (например, Retrofit). С другой стороны, очень удобно использовать его, как только вы к нему привыкнете. - person mewa; 01.03.2016
comment
@HiddenDroid: Не могу придумать каких-либо конкретных недостатков EventBus — все всегда сводится к вашей задаче. Как я сказал в своем ответе - если вам нужно только отправить некоторые события / ответить на некоторые события - шина отлично справится с этой задачей. Если ваша задача сложнее - возможно, стоит изучить другие решения. Хитрость заключается в том, чтобы найти правильный инструмент для задачи, поэтому не нужно навязывать себя RxJava, если все, что вам нужно, это 1-2 BroadcastReceivers... - person Vesko; 01.03.2016
comment
@Vesko Большое спасибо за ваш ответ. Я могу понять из вашего, что EventBus не рекомендуется, когда задача более сложная. Что я действительно хочу понять, так это то, что является негативным фактором в архитектуре EventBus, чтобы она не работала со сложными задачами? - person HiddenDroid; 01.03.2016
comment
@HiddenDroid, дело не в том, что EventBus не рекомендуется - все зависит от поставленной задачи. Сравнивать их все равно, что сравнивать апельсины с яблоками — у них разное назначение. Сила RxJava в его операторах — проверьте их здесь: reactivex.io/documentation/operators.html. Как видите, вы можете очень легко преобразовывать, фильтровать, связывать, буферизировать, обрабатывать ошибки и делать много других вещей. - person Vesko; 01.03.2016

Чтобы понять RxJava, подумайте о списке. Сегодня манипуляции со списком, такие как преобразование, разделение, слияние, можно легко выполнить с помощью функциональных методов (map, groupBy и т. д.). RxJava использует те же принципы, за исключением того, что его основной целью является не список, а поток. Поток — это асинхронный, часто живые данные, такие как канал веб-сокета или онлайн-фильм.

Шина событий возникает из-за необходимости отделить классы, которые в Android часто связаны с жизненным циклом. Тесная связь сетевого обратного вызова и представлений Activity как экземпляра была причиной многочисленных исключений нулевого указателя. Шина событий с шаблоном издатель-подписчик решает эту проблему.

Как это смешивается с RxJava? Для начала RxJava включает шаблон Observable. Здесь Observer наблюдает за Observable и реагирует, когда происходит событие. Observable имеет несколько подклассов, среди которых Subject, обладающий свойствами как Observable, так и Observer. Поскольку он работает, перехватывая событие и публикуя его подписчикам, технически он функционирует как шина событий.

Разумно ли использовать RxJava в качестве шины событий? Нет. RxJava внесет ненужные сложности для более простых целей. Используйте его только в том случае, если приложение манипулирует потоками. Например, объединение кадров из кинопотока и субтитров из другого потока. Если приложение просто использует REST API и ему необходимо отделить обратный вызов от действий/фрагментов, тогда достаточно шины событий.

person inmyth    schedule 08.04.2019

Live @Vesko написал, что RxJava и шина событий различаются по своей природе и могут служить для решения разных задач. Тем не менее, есть некоторые сценарии, в которых оба они могут решить одну и ту же проблему (хотя и с разной стоимостью), и это может быть причиной того, почему многие люди путают эти два понятия.

RxJava концептуально похож на Android LiveData, который был выпущен не так давно, и чтобы лучше понять эти концепции, а также шину событий, я предлагаю вам прочитать мой пост. В посте я рассматриваю эти самые концепции, описывая сценарии, в которых мы должны использовать один вместо другого, а также плюсы и минусы использования одного, а не другого. Я думаю, что это может быть полезно для вас:

Когда и зачем использовать LiveData

person TheCodeFather    schedule 30.04.2018

Если вы хотите получить данные с сервера и обновить пользовательский интерфейс, используйте RxJava + Refrofit. Если обновить пользовательский интерфейс или выполнить какую-либо операцию без получения данных, достаточно EventBus.

person Raul Yang    schedule 21.08.2018