Android
Otto Event Bus
Buscar..
Observaciones
Otto está en desuso a favor de RxJava
y RxAndroid
. Estos proyectos permiten el mismo modelo de programación controlado por eventos que Otto, pero son más capaces y ofrecen un mejor control de los hilos.
Pasando un evento
Este ejemplo describe cómo pasar un evento usando el Otto Event Bus .
Para usar Otto Event Bus en Android Studio , debe insertar la siguiente declaración en su módulo de archivos de gradle:
dependencies {
compile 'com.squareup:otto:1.3.8'
}
El evento que nos gustaría pasar es un simple objeto Java:
public class DatabaseContentChangedEvent {
public String message;
public DatabaseContentChangedEvent(String message) {
this.message = message;
}
}
Necesitamos un autobús para enviar eventos. Esto es típicamente 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() {
}
}
Para enviar un evento solo necesitamos nuestro BusProvider y su método de post
. Aquí enviamos un evento si se completa la acción de una AsyncTask:
public abstract class ContentChangingTask extends AsyncTask<Object, Void, Void> {
...
@Override
protected void onPostExecute(Void param) {
BusProvider.getInstance().post(
new DatabaseContentChangedEvent("Content changed")
);
}
}
Recibiendo un evento
Para recibir un evento es necesario implementar un método con el tipo de evento como parámetro y anotarlo con @Subscribe
. Además, debe registrar / anular el registro de la instancia de su objeto en el BusProvider
(ver ejemplo Enviando 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: para recibir ese evento debe existir una instancia de la clase. Este no suele ser el caso cuando desea enviar un resultado de una actividad a otra actividad. Así que revisa tu caso de uso para el autobús del evento.