Хорошо ли заменить широковещательный приемник с помощью Greenrobot Eventbus для запуска функций, основанных на событиях, и передачи данных от обслуживания к активности?

Я реализовал службу, в которой я обрабатываю изменения состояния (подключаюсь, отключается, onServiceDiscoverd, onCharacteristicChange и т.д.) и получая данные с другого устройства через сервер gatt.

Мой вопрос: можно ли эффективно обрабатывать события, используя Greenrobot Eventbus, заменяя широковещательный приемник между сервисом и активностью?

Ответ 1

В отличие от LocalBroadcastManager, EventBus проще использовать. Вы выполняете только три шага:

1- Создать класс события. Простой Java-класс, представляющий ответ, когда действие происходит.

2- Зарегистрируйте шину событий в качестве подписчика в методе Activity onCreate

  EventBus.getDefault().register(this);

И, конечно же, отмените регистрацию в методе Activity onDestroy

 EventBus.getDefault().unregister(this);

3- Метод подписки создается в том же самом действии, который зарегистрирован для EventBus. Пример в WorkOrderActivity

   @Subscribe
    public void onEvent(EventClass event)

Когда событие происходит, вы должны вызвать метод post, передав ранее созданный объект событий.

  EventBus.getDefault().post(new EventClass (Data));

Как упоминалось в kmaini, вы можете заменить его на LocalBroadcastManager, но вам придется отображать данные из намерения самостоятельно. В отличие от EventBus, который может передавать объекты.

Кроме того, greenrobot, создатели библиотеки EventBus, ответили на этот вопрос здесь:

В: Как EventBus отличается от Android BroadcastReceiver/Intent система?

A: В отличие от системы Android BroadcastReceiver/Intent, EventBus использует стандартные классы Java как события и предлагает более удобный API. EventBus предназначен для гораздо большего использования случаев, когда вы не хотите пройти через работу по настройке намерений, подготавливая намерение дополнения, внедрение широковещательных приемников и извлечение Intent дополнительные услуги снова. Кроме того, EventBus имеет намного меньшие накладные расходы.

Ответ 2

Вот ссылка, которую я выполнил для реализации LocalBroadcast:

fooobar.com/questions/19218/...

Вот краткое изложение моей реализации:

В принимающей активности или услуге:

1) Зарегистрируйтесь для локального braodcast (обычно в onCreate):

LocalBroadcastManager.getInstance(this).registerReceiver(
       mMessageReceiver, new IntentFilter("broacast_name"));

2) Отмените регистрацию для локального широковещательного (обычно onDestroy):

LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);

3) Определите широковещательный приемник:

 private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
           @Override
           public void onReceive(Context context, Intent intent) {
                      //Handle local broadcast
           }
};

В отправляющей операции или услуге:

Intent it = new Intent("broacast_name");
it.putExtra("data", "value");
LocalBroadcastManager.getInstance(context).sendBroadcast(it);

Ответ 3

С другой стороны, я считаю, что руководители эфиров в Android используют очередь сообщений обработчика основного потока для обработки событий. Таким образом, если вы можете использовать другой поток (если у вас нет событий/заданий/задач UI) с надлежащей очередью (например, с использованием другого HandlerThread), вы можете воспользоваться этой очереди, зависящей от потока, для обработки ваших заданий, не мешая событиям пользовательского интерфейса и смешивая ваши вещи с работой пользовательского интерфейса. Вы также можете играть с приоритетом потока, чтобы сбалансировать работу.

Теперь, если GreenRobot предоставляет все функциональные возможности в нескольких строках кода, я бы определенно попытался увидеть его прирост.

Ответ 4

EventBus делает вещи намного проще, потому что вы можете передавать произвольные объекты Java в этом событии. Вы не делаете то же самое с Intents, потому что ваш объект должен реализовывать Parcelable и "утомительную" логическую реализацию, которая является чем-то, что вы возможно, не что делать с существующей базой кода.