Я смущен различием между EventBus и RxJava в android. Мне нужно реализовать один из них для моей проблемы об уведомлении некоторых компонентов, когда были сделаны некоторые изменения, чтобы они могли обновить свое состояние.
Кроме того, я читал, что EventsBus стал устаревшим по сравнению с RxJava, и я не знаю, истинна эта информация или нет.
В чем разница между EventBus и RxJava?
Ответ 1
EventBus
и RxJava
отличаются по своей природе.
EventBus
- это просто bus
, как следует из названия, - он предоставляет механизм для подписки и публикации событий на "шине", без заботы о том, как выполняется проводка, что такое эта "шина" и т.д.. В контексте Android EventBus
- это просто более простой способ обработки и приема сообщений Broadcast
с меньшим количеством шаблонов.
RxJava
, с другой стороны, намного сильнее. Да, вы можете подписаться и публиковать события, но у вас есть гораздо больший контроль над процессом - частота, по которой все происходит и т.д. Основная сила RxJava
(на мой взгляд) заключается в том, что вы можете манипулировать публикуемыми данными очень просто, используя некоторые из его тонн operators
.
Подводя итог - если вы только заботитесь о публикации некоторых событий и выполнении некоторых действий при получении - вам, вероятно, будет лучше использовать простейший из двух, а именно какой-то bus
или даже простой старый BroadcastReceiver
s. Если вам также пригодится преобразование данных, обработка потоков или упрощенная обработка ошибок - перейдите к подходу RxJava
. Просто имейте в виду, что RxJava
обычно имеет крутую кривую обучения, поэтому требуется некоторое время, чтобы привыкнуть к ее концепции.
Ответ 2
Чтобы понять RxJava, придумайте список. Сегодня манипулирование списком, такое как преобразование, разбиение, объединение, может быть легко выполнено с использованием функциональных методов (map, groupBy и т.д.). RxJava использует те же принципы, за исключением того, что его основной целью является не список, а поток. Поток - это асинхронные, часто живые данные, такие как канал веб-сокета или онлайн-фильм.
Шина событий возникает из-за необходимости разделять классы, которые в Android часто связаны с жизненным циклом. Тесная связь между обратным вызовом сети и представлениями активности для экземпляра была причиной многочисленных исключений нулевого указателя. Шина событий с ее шаблоном издатель-подписчик облегчает эту проблему.
Как это смешивается с RxJava? Для начала RxJava включает в себя наблюдаемый шаблон. Здесь Наблюдатель наблюдает за Наблюдаемым и реагирует, когда происходит событие. У Observable есть несколько подклассов, среди которых Subject, обладающий свойствами Observable и Observer. Поскольку он работает, перехватывая событие и публикуя его подписчикам, он технически функционирует как шина событий.
Разумно ли использовать RxJava в качестве шины событий? Нет. RxJava внесет ненужные сложности для более простых целей. Используйте его, только если приложение манипулирует потоками. Например, сопряжение кадров из потока фильма и субтитров из другого потока. Если приложение просто использует REST API и нуждается в отделении обратного вызова от действий/фрагментов, тогда достаточно шины событий.
Ответ 3
Live @Vesko пишет, что RxJava и шина событий отличаются по своей природе и могут служить для решения разных проблем. Тем не менее, существуют некоторые сценарии, в которых оба они могут решить одну и ту же проблему (хотя и с разными затратами), и это может быть причиной того, почему многие люди путают эти два понятия.
RxJava концептуально похож на Android LiveData, который был выпущен не так давно, и чтобы лучше понять эти концепции, а также шину событий, я предлагаю вам прочитать мой пост. В этом посте я перейду к этим самым понятиям, описываю сценарии, в которых мы должны использовать друг друга, а также плюсы и минусы использования одного, а не другого. Я думаю, что это может быть полезно для вас:
Ответ 4
Если вы хотите получать данные с сервера и обновлять пользовательский интерфейс, используйте RxJava + Refrofit. Если пользовательский интерфейс обновлен или выполняется какая-либо операция без извлечения данных, достаточно EventBus.