Android
Otto Event Bus
Suche…
Bemerkungen
Otto ist veraltet zugunsten von RxJava
und RxAndroid
. Diese Projekte erlauben dasselbe ereignisgesteuerte Programmiermodell wie Otto, sind jedoch leistungsfähiger und bieten eine bessere Steuerung des Threadings.
Eine Veranstaltung übergeben
Dieses Beispiel beschreibt das Übergeben eines Ereignisses mit dem Otto Event Bus .
Um den Otto Event Bus in Android Studio verwenden zu können , müssen Sie die folgende Anweisung in die Modul-Datei einfügen:
dependencies {
compile 'com.squareup:otto:1.3.8'
}
Das Ereignis, das wir übergeben möchten, ist ein einfaches Java-Objekt:
public class DatabaseContentChangedEvent {
public String message;
public DatabaseContentChangedEvent(String message) {
this.message = message;
}
}
Wir brauchen einen Bus, um Ereignisse zu senden. Dies ist normalerweise ein 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() {
}
}
Um eine Veranstaltung zu versenden, benötigen wir nur unseren BusProvider und dessen post
Methode. Hier senden wir ein Ereignis, wenn die Aktion einer AsyncTask abgeschlossen ist:
public abstract class ContentChangingTask extends AsyncTask<Object, Void, Void> {
...
@Override
protected void onPostExecute(Void param) {
BusProvider.getInstance().post(
new DatabaseContentChangedEvent("Content changed")
);
}
}
Ereignis empfangen
Um ein Ereignis zu erhalten, muss eine Methode mit dem Ereignistyp als Parameter implementiert und mit @Subscribe
kommentiert werden. Außerdem müssen Sie die Instanz Ihres Objekts beim BusProvider
registrieren / die BusProvider
(siehe Beispiel Ereignis senden ):
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);
}
}
Wichtig: Um dieses Ereignis zu erhalten, muss eine Instanz der Klasse vorhanden sein. Dies ist normalerweise nicht der Fall, wenn Sie ein Ergebnis von einer Aktivität an eine andere Aktivität senden möchten. Überprüfen Sie also Ihren Use Case für den Event-Bus.