Intereting Posts
Обработка событий касания в ScrollView Android Изображения, сделанные с помощью ACTION_IMAGE_CAPTURE, всегда возвращают 1 для ExifInterface.TAG_ORIENTATION на некоторых более новых устройствах Как получить разрешение экрана устройства Android с использованием LIBGDX? Android JNI – Call AttachCurrentThread без DetachCurrentThread Как заставить новый NavigationView играть хорошо со строкой состояния? Какой андроид: inputType следует использовать для ввода IP-адреса? Как я могу заполнить RecyclerView с помощью GridLayoutManager справа налево Странное поведение updateViewLayout Примеры пользовательского интерфейса Android Скрытие заголовка панели действий не работает в старых версиях Android (с помощью ActionBarSherlock) Переключение между фрагментами с помощью функции OnNavigationItemSelected в новом шаблоне активности навигационного ящика (Android Studio 1.4) Как сделать панель контекстного ActionMode наложением панели инструментов appcompat-v7, но не ящиком навигации? Плагин Android Studio слишком стар. Android Создание настраиваемого измерения в Google Analytics Как установить фиксированное соотношение сторон для макета в Android

Что является более эффективным широковещательным приемником или обработчиком?

Я знаю, что onReceive () приемника Broadcast и handleMessage () обработчика запускают один и тот же поток пользовательского интерфейса. Предположим, я хочу общаться между двумя службами в одном приложении (процессе). Я могу расширить класс вещательного приемника и зарегистрировать событие

ИЛИ

Обработчик, а затем передать свой экземпляр другой службе, которая будет использоваться для вызовов sendMessage (). В обоих случаях мне нужно будет добавить новый корпус коммутатора. Но какой подход более эффективен? Предположим, что код является потокобезопасным (без обновления пользовательского интерфейса).

Solutions Collecting From Web of "Что является более эффективным широковещательным приемником или обработчиком?"

Я могу расширить класс вещательного приемника и зарегистрировать событие

Если вы имеете в виду, что вы делаете это через LocalBroadcastManager (см. Подробный ответ г-на LocalBroadcastManager ), Handler будет немного более эффективным, так как LocalBroadcastManager использует Handler . Однако разница в производительности не должна быть достаточной. То же самое можно сказать о других реализациях событий в процессе, таких как EventBus от greenrobot и Otto Square. Все должно быть достаточно быстро, чтобы другие проблемы, такие как ремонтопригодность, были первостепенными.

Если вы имеете в виду, что вы делаете это через системные трансляции (например, sendBroadcast() вызываемые в Context ), то реализация Handler , LocalBroadcastManager или других реализаций шины событий будет значительно быстрее и более безопасна.

Все это предполагает, что обе службы находятся в одном процессе.

Самое быстрое решение – объединить две службы в одну. Это особенно верно, если они имеют одинаковую продолжительность жизни. Существует множество случаев, когда наличие 2+ услуг в приложении разумно, но не создавайте множество независимых небольших сервисов без явной причины для этого.

Вы не должны использовать обычные широковещательные передачи для связи между 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); } 

Не забудьте позже onPause() регистрацию BroadcastReceiveronPause() ):

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