Меня смущает разница между EventBus и RxJava в Android. Мне нужно реализовать один из них для моей проблемы с уведомлением некоторых компонентов, когда были сделаны некоторые изменения, чтобы они могли обновить свое состояние.
Кроме того, я читал, что EventsBus устарел по сравнению с RxJava, и я не знаю, если эта информация верна или нет.
В чем разница между EventBus и RxJava?
Ответы (4)
EventBus
и RxJava
различны по своей природе.
EventBus
— это всего лишь bus
, как следует из названия — он обеспечивает механизм подписки и публикации событий в «шине», не заботясь о том, как выполняется подключение, что на самом деле представляет собой эта «шина» и т. д. В контексте Android EventBus
- это просто более простой способ отправки и получения Broadcast
сообщений с меньшим количеством шаблонов.
RxJava
, с другой стороны, намного мощнее. Да, вы можете подписаться и публиковать события, но у вас гораздо больше контроля над процессом — частотой, в каком потоке все происходит и т. д. Основная сила RxJava
(на мой взгляд) в том, что вы можете очень легко манипулировать публикуемыми данными. , используя некоторые из своих тонн operators
.
Подводя итог - если вы заботитесь только о публикации некоторых событий и выполнении некоторых действий при получении - вам, вероятно, лучше использовать самый простой из двух, а именно какой-то Bus
или даже старый добрый BroadcastReceiver
s. Если вы также выиграете от преобразования данных, обработки многопоточности или упрощенной обработки ошибок — используйте подход RxJava
. Просто имейте в виду, что RxJava
обычно имеет крутую кривую обучения, поэтому требуется некоторое время, чтобы привыкнуть к его концепции.
EventBus
— все всегда сводится к вашей задаче. Как я сказал в своем ответе - если вам нужно только отправить некоторые события / ответить на некоторые события - шина отлично справится с этой задачей. Если ваша задача сложнее - возможно, стоит изучить другие решения. Хитрость заключается в том, чтобы найти правильный инструмент для задачи, поэтому не нужно навязывать себя RxJava, если все, что вам нужно, это 1-2 BroadcastReceivers...
- person Vesko; 01.03.2016
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 и ему необходимо отделить обратный вызов от действий/фрагментов, тогда достаточно шины событий.
Live @Vesko написал, что RxJava и шина событий различаются по своей природе и могут служить для решения разных задач. Тем не менее, есть некоторые сценарии, в которых оба они могут решить одну и ту же проблему (хотя и с разной стоимостью), и это может быть причиной того, почему многие люди путают эти два понятия.
RxJava концептуально похож на Android LiveData, который был выпущен не так давно, и чтобы лучше понять эти концепции, а также шину событий, я предлагаю вам прочитать мой пост. В посте я рассматриваю эти самые концепции, описывая сценарии, в которых мы должны использовать один вместо другого, а также плюсы и минусы использования одного, а не другого. Я думаю, что это может быть полезно для вас:
Когда и зачем использовать LiveData
Если вы хотите получить данные с сервера и обновить пользовательский интерфейс, используйте RxJava + Refrofit. Если обновить пользовательский интерфейс или выполнить какую-либо операцию без получения данных, достаточно EventBus.