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


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

Или

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

3 14

3 ответа:

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

Если вы имеете в виду, что делаете это через 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);
}

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