Szyna zdarzeń
Szyna zdarzeń EventBus
upraszcza komunikacje pomiędzy różnymi komponentami systemu Android
(Activity
, Fragment
, Service
itp) za pomocą zdarzeń (event
) co szczególnie może być przydatne w zadaniach asynchronicznych. Jest realizacją wzorca Obserwator
(Observer
) - wprowadza podział na nadawców oraz odbiorców. Zdarzenie emitowane jest przez jednego nadawcę i trafia do wszystkich aktywnych odbiorców zarejestrowanych do szyny zdarzeń. Dobrze radzi sobie z cyklem życia komponentów oraz wątkami tła, posiada lekką strukturę, unika złożonych zależności i upraszcza kod. Jednakże z momentem wprowadzenia, stabilizacji i zyskiwania popularności programowania reaktywnego w RxJava
, architektura szyny zdarzeń staje się przestarzała. Oba projekty implementują ten sam model programowania oparty o zdarzenia lecz RxJava
jest bardziej wydajne i zapewnia lepszą kontrolę nad wątkami przez co wydaje się naturalnym następnikiem. Konfiguracja i zmiana domyślnego zachowania instancji EventBus
powinna zostać przeprowadzona przed pierwszym użyciem instancji szyny zdarzeń.
Rejestracja
Aby móc odbierać zdarzenia zarówno subskrybenci powinni dokonać rejestracji do instancji szyny zdarzeń EventBus zgodnie ze swoim cyklem życia. Należy również pamiętać o prawidłowym odrejestrowaniu komponentów co w przeciwnym razie może prowadzić do wycieku pamięci.
Zdarzenie
Zdarzenie jest niczym innym jak emisją obiektu danej klasy przez nadawcę. W sytuacji, gdy pożądane jest rozróżnienie zdarzeń o tej samej strukturze należy stworzyć dla każdego rodzaju zdarzenia klasę opakowującą (wrapper
). Dobrą praktyką jest zawieranie w nazwie klasy słowa Event
.
Nadawca
Wysyłania zdarzenia zachodzi na instancji EventBus
z dowolnego fragmentu kodu i przeprowadzane jest przez przekazywanie obiektu do metody post
lub postSticky
(dla zdarzenia, które ma zostać zapamiętane do przyszłego użycia).
Subskrybent
Aby zarejestrowany komponent mógł reagować na emisję danego zdarzenia powinien implementować metodę oznaczoną adnotacją @Subscribe
i przyjmującą jako parametr wybrany typ (nazwa metody nie ma znaczenia). Dodatkowo istnieje możliwość ustawienia wątku roboczego na jakim odebrane zdarzenie będzie wykonywało pracę (threadMode
), ustalenie priorytetu subskrypcji w obrębie tego samego wątku (priority
) czy zdecydowanie o pobieraniu ostatniej znanej instancji zdarzenia (sticky
). Każdy subskrybent zostanie wywołane dokładnie raz.