Поиск…


Синтаксис

  • @Subscribe (threadMode = ThreadMode.POSTING) public void onEvent (событие EventClass) {}

параметры

Ветвь дискуссии Описание
ThreadMode.POSTING Будет вызван в тот же поток, что событие было опубликовано. Это режим "по умолчанию".
ThreadMode.MAIN Будет вызван в основной поток пользовательского интерфейса.
ThreadMode.BACKGROUND Будет вызван фоновый поток. Если поток проводки не является основным потоком, он будет использоваться. Если отправлено в основной поток, EventBus имеет один фоновый поток, который он будет использовать.
ThreadMode.ASYNC Будет вызван в свою собственную нить.

Создание объекта Event

Для отправки и получения событий нам сначала нужен объект Event. Объекты событий - фактически простые POJO.

public class ArbitaryEvent{
    public static final int TYPE_1 = 1;
    public static final int TYPE_2 = 2;
    private int eventType;
    public ArbitaryEvent(int eventType){
        this.eventType = eventType;
    }
    
    public int getEventType(){
        return eventType;
    }
}

Получение событий

Для получения событий вам необходимо зарегистрировать свой класс на EventBus .

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
   EventBus.getDefault().unregister(this);
   super.onStop();
}

А затем подписаться на события.

@Subscribe(threadMode = ThreadMode.MAIN)
public void handleEvent(ArbitaryEvent event) {
    Toast.makeText(getActivity(), "Event type: "+event.getEventType(), Toast.LENGTH_SHORT).show();
}

Отправка событий

Отправка событий так же просто, как создание объекта Event, а затем его публикация.

EventBus.getDefault().post(new ArbitaryEvent(ArbitaryEvent.TYPE_1));

Прохождение простого события

Первое, что нам нужно сделать, добавить EventBus в файл градиента нашего модуля:

dependencies {
    ...
    compile 'org.greenrobot:eventbus:3.0.0'
    ...
}

Теперь нам нужно создать модель для нашего мероприятия. Он может содержать все, что мы хотим передать. Сейчас мы просто создадим пустой класс.

public class DeviceConnectedEvent
{
}

Теперь мы можем добавить код в нашу Activity которая будет регистрироваться в EventBus и подписаться на это событие.

public class MainActivity extends AppCompatActivity
{
    private EventBus _eventBus;

    @Override
    protected void onCreate (Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        _eventBus = EventBus.getDefault();
    }

    @Override
    protected void onStart ()
    {
        super.onStart();
        _eventBus.register(this);
    }

    @Override
    protected void onStop ()
    {
        _eventBus.unregister(this);
        super.onStop();
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onDeviceConnected (final DeviceConnectedEvent event)
    {
        // Process event and update UI
    }
}

В этой Activity мы получаем экземпляр EventBus в onCreate() метода. Мы регистрируем / onStart() регистрацию событий в onStart() / onStop() . Важно помнить о том, чтобы отменить регистрацию, когда ваш слушатель теряет объем, или вы можете пропустить свою Activity .

Наконец, мы определяем метод, который мы хотим вызвать с событием. @Subscribe сообщает EventBus, какие методы он может искать для обработки событий. У вас должен быть хотя бы один метод, аннотированный с помощью @Subscribe для регистрации в EventBus, иначе он выдает исключение. В аннотации мы определяем режим потока. Это сообщает EventBus, какой поток вызывает метод. Это очень удобный способ передачи информации из фонового потока в поток пользовательского интерфейса! Это именно то, что мы делаем здесь. ThreadMode.MAIN означает, что этот метод будет вызываться в основном потоке пользовательского интерфейса Android, поэтому вам безопасно делать какие-либо манипуляции с пользовательским интерфейсом здесь, что вам нужно. Имя метода не имеет значения. @Subscribe только думать, что аннотация @Subscribe , которую ищет EventBus, является типом аргумента. Пока тип совпадает, он будет вызываться, когда событие отправлено.

Последнее, что нам нужно сделать, чтобы отправить событие. Этот код будет в нашей Service .

EventBus.getDefault().post(new DeviceConnectedEvent());

Вот и все! EventBus возьмет этот DeviceConnectedEvent и просмотрит зарегистрированные зарегистрированные слушатели, просмотрит методы, которые они подписали, и найдите те, которые принимают DeviceConnectedEvent в качестве аргумента, и вызовите их в потоке, который они хотят вызвать.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow