Android
Autobus zdarzeń Otto
Szukaj…
Uwagi
Otto jest przestarzałe na rzecz RxJava
i RxAndroid
. Projekty te dopuszczają ten sam model programowania sterowany zdarzeniami, co Otto, ale są bardziej zdolne i oferują lepszą kontrolę nad wątkami.
Przekazywanie wydarzenia
W tym przykładzie opisano przekazanie zdarzenia za pomocą magistrali zdarzeń Otto .
Aby użyć Magistrali zdarzeń Otto w Android Studio , musisz wstawić następującą instrukcję do pliku ocen modułów:
dependencies {
compile 'com.squareup:otto:1.3.8'
}
Wydarzenie, które chcielibyśmy przekazać, to prosty obiekt Java:
public class DatabaseContentChangedEvent {
public String message;
public DatabaseContentChangedEvent(String message) {
this.message = message;
}
}
Potrzebujemy autobusu do wysyłania wydarzeń. Zazwyczaj jest to singleton:
import com.squareup.otto.Bus;
public final class BusProvider {
private static final Bus mBus = new Bus();
public static Bus getInstance() {
return mBus;
}
private BusProvider() {
}
}
Aby wysłać wydarzenie, potrzebujemy tylko naszego BusProvider i jego metody post
. Tutaj wysyłamy zdarzenie, jeśli akcja AsyncTask jest zakończona:
public abstract class ContentChangingTask extends AsyncTask<Object, Void, Void> {
...
@Override
protected void onPostExecute(Void param) {
BusProvider.getInstance().post(
new DatabaseContentChangedEvent("Content changed")
);
}
}
Odbieranie wydarzenia
Aby otrzymać zdarzenie, konieczne jest zaimplementowanie metody z typem zdarzenia jako parametrem i @Subscribe
go adnotacją za pomocą @Subscribe
. Ponadto musisz zarejestrować / wyrejestrować wystąpienie swojego obiektu w BusProvider
(patrz przykład Wysyłanie zdarzenia ):
public class MyFragment extends Fragment {
private final static String TAG = "MyFragment";
...
@Override
public void onResume() {
super.onResume();
BusProvider.getInstance().register(this);
}
@Override
public void onPause() {
super.onPause();
BusProvider.getInstance().unregister(this);
}
@Subscribe
public void onDatabaseContentChanged(DatabaseContentChangedEvent event) {
Log.i(TAG, "onDatabaseContentChanged: "+event.message);
}
}
Ważne: Aby otrzymać to zdarzenie, musi istnieć instancja klasy. Zwykle nie dzieje się tak, gdy chcesz wysłać wynik z jednego działania do drugiego. Sprawdź więc przypadek użycia magistrali zdarzeń.