Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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, который был выпущен не так давно, и чтобы лучше понять эти концепции, а также шину событий, я предлагаю вам прочитать мой пост. В этом посте я перейду к этим самым понятиям, описываю сценарии, в которых мы должны использовать друг друга, а также плюсы и минусы использования одного, а не другого. Я думаю, что это может быть полезно для вас:

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

Ответ 4

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