Android
GreenRobot EventBus
Szukaj…
Składnia
- @Subscribe (threadMode = ThreadMode.POSTING) public void onEvent (EventClass event) {}
Parametry
Tryb wątku | Opis |
---|---|
ThreadMode.POSTING | Zostanie wywołany w tym samym wątku, w którym wydarzenie zostało opublikowane. To jest tryb domyślny. |
ThreadMode.MAIN | Zostanie wywołany w głównym wątku interfejsu użytkownika. |
ThreadMode.BACKGROUND | Zostanie wywołany w wątku w tle. Jeśli wątek wysyłający nie jest głównym wątkiem, zostanie użyty. Jeśli opublikowany w głównym wątku, EventBus ma pojedynczy wątek w tle, którego będzie używał. |
ThreadMode.ASYNC | Zostanie wywołany w swoim wątku. |
Tworzenie obiektu zdarzenia
Do wysyłania i odbierania zdarzeń potrzebujemy najpierw obiektu Event. Obiekty zdarzeń są w rzeczywistości prostymi 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;
}
}
Odbieranie zdarzeń
Aby otrzymywać wydarzenia, musisz zarejestrować swoją klasę na EventBus
.
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
A potem subskrybuj wydarzenia.
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleEvent(ArbitaryEvent event) {
Toast.makeText(getActivity(), "Event type: "+event.getEventType(), Toast.LENGTH_SHORT).show();
}
Wysyłanie wydarzeń
Wysyłanie zdarzeń jest tak proste, jak utworzenie obiektu Event, a następnie opublikowanie go.
EventBus.getDefault().post(new ArbitaryEvent(ArbitaryEvent.TYPE_1));
Przekazywanie prostego zdarzenia
Pierwszą rzeczą, którą musimy zrobić, to dodać EventBus do pliku ocen naszego modułu:
dependencies {
...
compile 'org.greenrobot:eventbus:3.0.0'
...
}
Teraz musimy stworzyć model naszego wydarzenia. Może zawierać wszystko, co chcemy przekazać. Na razie stworzymy pustą klasę.
public class DeviceConnectedEvent
{
}
Teraz możemy dodać kod do naszej Activity
, która zarejestruje się w EventBus i zasubskrybuje wydarzenie.
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
}
}
W tym Activity
otrzymujemy instancję EventBus
w onCreate()
. Rejestrujemy / wyrejestrowujemy zdarzenia w onStart()
/ onStop()
. Ważne jest, aby pamiętać o wyrejestrowaniu się, gdy słuchacz traci zasięg lub możesz wyciec swoją Activity
.
Na koniec definiujemy metodę, którą chcemy wywołać ze zdarzeniem. Adnotacja @Subscribe
informuje EventBus, jakich metod może szukać do obsługi zdarzeń. Musisz zarejestrować co najmniej jedną metodę z @Subscribe
aby zarejestrować się w EventBus, inaczej spowoduje to wyjątek. W adnotacji definiujemy tryb wątku. To informuje EventBus, w którym wątku wywołać metodę. Jest to bardzo przydatny sposób przekazywania informacji z wątku tła do wątku interfejsu użytkownika! Właśnie to tutaj robimy. ThreadMode.MAIN
oznacza, że ta metoda zostanie wywołana w głównym wątku interfejsu użytkownika w systemie Android, więc można bezpiecznie wykonywać wszelkie potrzebne tu ThreadMode.MAIN
w interfejsie użytkownika. Nazwa metody nie ma znaczenia. Jedyną @Subscribe
, inną @Subscribe
adnotacja @Subscribe
, że EventBus szuka, jest typ argumentu. Dopóki typ pasuje, będzie wywoływany po opublikowaniu zdarzenia.
Ostatnią rzeczą, którą musimy zrobić, aby opublikować wydarzenie. Ten kod będzie w naszym Service
.
EventBus.getDefault().post(new DeviceConnectedEvent());
To wszystko! EventBus weźmie DeviceConnectedEvent i przejrzy zarejestrowane przez nas nasłuchiwania, przejrzy metody, które subskrybują, i znajdzie te, które biorą DeviceConnectedEvent jako argument i wywoła je w wątku, który ma zostać wywołany.