Android
Otto Event Bus
Ricerca…
Osservazioni
Otto è deprecato a favore di RxJava
e RxAndroid
. Questi progetti consentono lo stesso modello di programmazione event-driven di Otto, ma sono più capaci e offrono un migliore controllo del threading.
Passare un evento
Questo esempio descrive il passaggio di un evento utilizzando il bus eventi Otto .
Per utilizzare il bus eventi Otto in Android Studio devi inserire la seguente dichiarazione nel file gradle dei tuoi moduli:
dependencies {
compile 'com.squareup:otto:1.3.8'
}
L'evento che vorremmo passare è un semplice oggetto Java:
public class DatabaseContentChangedEvent {
public String message;
public DatabaseContentChangedEvent(String message) {
this.message = message;
}
}
Abbiamo bisogno di un autobus per inviare eventi. Questo è in genere un 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() {
}
}
Per inviare un evento abbiamo solo bisogno del nostro BusProvider e del suo metodo post
. Qui inviamo un evento se l'azione di un AsyncTask è completata:
public abstract class ContentChangingTask extends AsyncTask<Object, Void, Void> {
...
@Override
protected void onPostExecute(Void param) {
BusProvider.getInstance().post(
new DatabaseContentChangedEvent("Content changed")
);
}
}
Ricevere un evento
Per ricevere un evento è necessario implementare un metodo con il tipo di evento come parametro e annotarlo usando @Subscribe
. Inoltre devi registrare / annullare la registrazione dell'istanza del tuo oggetto su BusProvider
(vedi esempio Invio di un evento ):
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);
}
}
Importante: per ricevere quell'evento deve esistere un'istanza della classe. Questo di solito non è il caso quando si desidera inviare un risultato da un'attività a un'altra attività. Quindi controlla il tuo caso d'uso per il bus eventi.