Что является более эффективным приемником или обработчиком широковещательной передачи?
Я знаю, что onReceive () широковещательного приемника и handleMessage() обработчика работают в одном потоке пользовательского интерфейса. Предположим, я хочу общаться между двумя службами в рамках одного приложения (процесса) . Я могу расширить класс широковещательного приемника и зарегистрировать событие
Или
Обработчик, а затем передать его экземпляр другой службе, которая будет использоваться для вызовов sendMessage (). В обоих случаях мне нужно было бы добавить какой-то новый корпус коммутатора. Но какой подход более эффективен ? Предположим, что код потокобезопасен (никаких обновлений пользовательского интерфейса).
3 ответа:
Я могу расширить класс широковещательного приемника и зарегистрировать событие
Если вы имеете в виду, что делаете это через
LocalBroadcastManager
(смотрите отличный ответ Мистера Капеллера для деталей),Handler
будет несколько эффективнее, так какLocalBroadcastManager
используетHandler
. Однако разница в производительности не должна иметь большого значения. То же самое относится и к другим реализациям шины событий в процессе, таким как EventBus greenrobot и Otto Square. Все должно быть достаточно быстро, чтобы другие заботы, такие поскольку ремонтопригодность, должна быть первостепенной.Если вы имеете в виду, что делаете это через системные трансляции (например,
Все это предполагает, что обе службы находятся в одном и том же процессе. Самое быстрое решение - объединить эти две службы в одну. Это особенно верно, если они имеют одинаковую продолжительность жизни. Есть масса случаев где наличие 2 + сервисов в приложении разумно, но не создавайте множество независимых маленьких сервисов без четкой причины для этого.sendBroadcast()
, вызванные наContext
), тоHandler
,LocalBroadcastManager
, или другие реализации шины событий будут значительно быстрее и безопаснее.
Вы не должны использовать обычные широковещательные передачи для связи между
Activities
иServices
внутри вашего собственного приложения. Вместо этого вы должны использовать местное вещание! Сначала вы должны определитьBroadcastReceiver
как для обычных передач:private static final String ACTION_EXAMPLE = "ACTION_EXAMPLE"; private final BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if(ACTION_EXAMPLE.equals(intent.getAction())) { ... } } };
После этого вы можете получить
LocalBroadcastManager
Вот так:LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
И вы можете зарегистрировать
BroadcastReceiver
Вот так (обычно вы регистрируетеBroadcastReciever
вonResume()
):@Override public void onResume() { super.onResume(); LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity()); IntentFilter filter = new IntentFilter(ACTION_EXAMPLE); manager.registerReceiver(this.receiver, filter); }
Не забудьте отменить регистрацию
BroadcastReceiver
позже (вonPause()
):@Override public void onPause() { super.onPause(); LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity()); manager.unregisterReceiver(this.receiver); }
И, наконец, вы можете отправляйте местные радиопередачи следующим образом:
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity()); manager.sendBroadcast(intent);
Вызовы широковещательного приемника являются тяжелыми операциями, и есть шансы получить ANR, если событие транслируется несколько раз. А также контекст, который вы получаете в onReceive () широковещательного приемника имеет ограниченное использование, пока вы не получите контекст приложения.
Напротив, вызовы обработчиков эффективны, поскольку они просты и выполняются в разных потоках, и для запуска вызова обработчика не требуется никакого контекста. связь между 2 службами или действиями или 2 потоками может быть легко обработана с помощью обработчик. Воздействовать всеми другими способами, а именно:. Интенты и связанные службы используют обработчики внутри для передачи сообщений.