Buscar..


Sintaxis

  • @Subscribe (threadMode = ThreadMode.POSTING) public void onEvent (EventClass event) {}

Parámetros

Modo hilo Descripción
ThreadMode.POSTING Se llamará en el mismo hilo en el que se publicó el evento. Este es el modo por defecto.
ThreadMode.MAIN Se llamará en el hilo principal de la interfaz de usuario.
ThreadMode.BACKGROUND Será llamado en un hilo de fondo. Si el hilo de publicación no es el hilo principal, se utilizará. Si se publica en el hilo principal, EventBus tiene un solo hilo de fondo que utilizará.
ThreadMode.ASYNC Será llamado en su propio hilo.

Creando un objeto de evento

Para enviar y recibir eventos, primero necesitamos un objeto de evento. Los objetos de eventos son realmente POJOs simples.

public class ArbitaryEvent{
    public static final int TYPE_1 = 1;
    public static final int TYPE_2 = 2;
    private int eventType;
    public ArbitaryEvent(int eventType){
        this.eventType = eventType;
    }
    
    public int getEventType(){
        return eventType;
    }
}

Recibir eventos

Para recibir eventos necesita registrar su clase en el EventBus .

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
   EventBus.getDefault().unregister(this);
   super.onStop();
}

Y luego suscribirse a los eventos.

@Subscribe(threadMode = ThreadMode.MAIN)
public void handleEvent(ArbitaryEvent event) {
    Toast.makeText(getActivity(), "Event type: "+event.getEventType(), Toast.LENGTH_SHORT).show();
}

Enviando eventos

Enviar eventos es tan fácil como crear el objeto Evento y luego publicarlo.

EventBus.getDefault().post(new ArbitaryEvent(ArbitaryEvent.TYPE_1));

Pasando un evento simple

Lo primero que tenemos que hacer es agregar EventBus al archivo gradle de nuestro módulo:

dependencies {
    ...
    compile 'org.greenrobot:eventbus:3.0.0'
    ...
}

Ahora necesitamos crear un modelo para nuestro evento. Puede contener cualquier cosa que queramos transmitir. Por ahora solo haremos una clase vacía.

public class DeviceConnectedEvent
{
}

Ahora podemos agregar el código a nuestra Activity que se registrará en EventBus y suscribirse al evento.

public class MainActivity extends AppCompatActivity
{
    private EventBus _eventBus;

    @Override
    protected void onCreate (Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        _eventBus = EventBus.getDefault();
    }

    @Override
    protected void onStart ()
    {
        super.onStart();
        _eventBus.register(this);
    }

    @Override
    protected void onStop ()
    {
        _eventBus.unregister(this);
        super.onStop();
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onDeviceConnected (final DeviceConnectedEvent event)
    {
        // Process event and update UI
    }
}

En esta Activity obtenemos una instancia de EventBus en el método onCreate() . Registramos / desregistramos para eventos en onStart() / onStop() . Es importante recordar cancelar el registro cuando su interlocutor pierda el alcance o podría perder su Activity .

Finalmente definimos el método que queremos llamar con el evento. La anotación @Subscribe le dice a EventBus qué métodos puede buscar para manejar eventos. @Subscribe tener al menos un método anotado con @Subscribe para registrarse en EventBus o se producirá una excepción. En la anotación definimos el modo hilo. Esto le dice a EventBus en qué hilo invocar el método. ¡Es una forma muy útil de pasar información de un subproceso en segundo plano al subproceso de la interfaz de usuario! Eso es exactamente lo que estamos haciendo aquí. ThreadMode.MAIN significa que este método se llamará en el hilo principal de la interfaz de usuario de Android, por lo que es seguro realizar cualquier manipulación de la interfaz de usuario que necesite. El nombre del método no importa. El único pensamiento, aparte de la anotación @Subscribe , que EventBus está buscando es el tipo de argumento. Siempre que el tipo coincida, se llamará cuando se publique un evento.

Lo último que tenemos que hacer para publicar un evento. Este código estará en nuestro Service .

EventBus.getDefault().post(new DeviceConnectedEvent());

¡Eso es todo al respecto! EventBus tomará ese DeviceConnectedEvent y examinará sus escuchas registrados, examinará los métodos que se han suscrito y encontrará los que toman un DeviceConnectedEvent como un argumento y los llamará al hilo en el que desean que se les llame.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow