Android
GreenBot EventBus
Поиск…
Синтаксис
- @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 в качестве аргумента, и вызовите их в потоке, который они хотят вызвать.