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