Cómo usar EventBus en Android

Usar EventBus es muy primitivo.

Cómo comenzar con EventBus en 3 pasos: código abierto de greenrobot

Aunque existen múltiples casos de uso, uno de los lugares más básicos donde le gustaría usar sería cuando intenta comunicarse entre una clase de Actividad y una clase sin actividad o comunicarse entre fragmentos.

Así que sigue el enlace si no entiendes esto, estoy seguro de que lo explicarán de una manera mucho mejor que yo.

Escenario: Digamos que tiene dos clases en este momento, una es la clase Actividad y la otra es solo una clase sin actividad que calcula el porcentaje de un estudiante. Aquí, una forma de devolver los datos de la clase de cálculo porcentual era usar un método de devolución o simplemente usar una interfaz para invocar la comunicación ( así es como funciona la biblioteca eventbus, aunque se mantiene un bus y suceden muchas otras cosas, necesita no sé sobre esto por ahora ), ¿verdad? Por lo tanto, si usa el método de retorno, finalmente está creando un movimiento sincrónico y esto puede ser muy irregular mientras está en el hilo de la interfaz de usuario. Entonces, ¿cómo lo haces de forma asincrónica? Utiliza eventbus.

  • Sus datos se almacenan en un POJO (trate esto como un paquete de contenido entre las dos entidades que está tratando de comunicar).
  • Usted envía los datos simplemente ‘publicando datos’:

EventBus.getDefault (). Post (nuevo yourCustomPOJO (“param1”, “param2”));

  • Luego, para recibir los datos, simplemente haga que su clase se suscriba al autobús ‘registrando’ su clase

crear -> EventBus.getDefault (). registrarse (esto);

destruir -> EventBus.getDefault (). anular el registro (esto);

  • Por último usar

@Suscribir

en el método que le gustaría recibir su paquete (que creó en el primer paso y envió en el segundo paso)

Espero eso ayude.

Crear una aplicación de Android que tenga múltiples componentes activos que se comuniquen entre sí puede ser tedioso. Para ahorrar tiempo, los desarrolladores a menudo terminan con componentes estrechamente acoplados en sus aplicaciones. EventBus es una biblioteca de código abierto popular que se creó para resolver este problema utilizando el patrón editor / suscriptor .

Usando la biblioteca EventBus, puede pasar mensajes de una clase a una o más clases en solo unas pocas líneas de código. Además, todas las clases involucradas están completamente desacopladas entre sí, lo que lleva a un código que es menos complejo y más fácil de mantener y depurar.

En este consejo rápido, aprenderá cómo usar la biblioteca EventBus mediante la creación de una sencilla aplicación de Android que muestra el estado de carga del dispositivo. Debido a que los cambios en el estado de carga son eventos del sistema, la aplicación tendrá una Activity que necesita recibir información de un BroadcastReceiver , el escenario perfecto para usar un bus de eventos.

Prerrequisitos

Asegúrese de tener configurado el paquete Eclipse ADT. Puede descargarlo desde el sitio web para desarrolladores de Android.

1. Crear nuevo proyecto

Inicie Eclipse y cree una nueva aplicación para Android. Denomine la aplicación EventBusSample . Elija un nombre de paquete único y configure el SDK mínimo requerido en Android 2.2 y el SDK de destino en Android 4.4 .

Vamos a crear la Activity nosotros mismos, así que deseleccione Crear actividad y haga clic en Finalizar .

2. Editar manifiesto

Esta aplicación tiene un BroadcastReceiver que responde a las siguientes acciones:

  • android.intent.action.ACTION_POWER_CONNECTED
  • android.intent.action.ACTION_POWER_DISCONNECTED

Denomine BroadcastReceiver ChargingReceiver y declare en el archivo AndroidManifest.xml .

android:name=".ChargingReceiver">

android:name="android.intent.action.ACTION_POWER_CONNECTED" />

android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />

La aplicación tiene una Activity para mostrar el estado de carga. DisplayActivity y declare como se muestra a continuación.

android:name=".DisplayActivity">

android:name="android.intent.action.MAIN"/>

android:name="android.intent.category.LAUNCHER" />

3. Agregar EventBus Library

Descargue la última versión de la biblioteca EventBus como JAR de Maven Central y agregue el JAR en el directorio libs su proyecto.

4. Crear clase de ChargingEvent

Los eventos en el bus de eventos no son más que objetos que contienen la información que necesita ser comunicada. Deje que ChargingEvent sea ​​el nombre de la clase que contiene la información transmitida desde BroadcastReceiver a la Activity . Esta es una clase simple que solo tiene una String para representar la información. También tiene un constructor para establecer el valor de la cadena y un descriptor de acceso para obtener su valor.

Cree un nuevo archivo llamado ChargingEvent.java y agregue el siguiente código:

package com.hathy.eventbussample;

class ChargingEvent { class public ChargingEvent {

String data; private String data;

public ChargingEvent(String data){

this.data = data;

}

public String getData(){

return data;

}

}

5. Crear clase BroadcastReceiver

Cree una nueva clase llamada ChargingReceiver que extienda BroadcastReceiver . Esta clase usa el bus de eventos para publicar mensajes. Tiene una variable llamada bus , que hace referencia al bus creado por la biblioteca EventBus. El bus es un singleton y debe usar el método getDefault para referirse a él.

En el método onReceive , creamos una nueva instancia de la clase ChargingEvent y le agregamos nuestro mensaje. Aquí hay un mensaje de muestra:

1

@14:23:20 this device started charging.

Para generar este mensaje, debemos hacer lo siguiente:

  • Use los métodos disponibles en la clase Time para establecer la hora a la que ocurrió el evento.
  • Agregue la cadena "este dispositivo comenzó a cargar | descargar" en función de la acción recibida. Si la acción recibida es Intent.ACTION_POWER_CONNECTED , el dispositivo se está cargando. Si es Intent.ACTION_POWER_DISCONNECTED , el dispositivo se está descargando.

Una vez que el objeto ChargingEvent tiene la información correcta, se publica en el bus de eventos utilizando el método de post . La implementación de la clase ChargingReceiver ahora debería verse así:

package com.hathy.eventbussample;

import de.greenrobot.event.EventBus;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.text.format.Time;

ChargingReceiver extends class public ChargingReceiver extends BroadcastReceiver {

EventBus bus = EventBus.getDefault(); private EventBus bus = EventBus.getDefault();

@Override

public void onReceive(Context context, Intent intent) {

ChargingEvent event = null;

// Get current time

Time now = new Time();

now.setToNow();

String timeOfEvent = now.format("%H:%M:%S");

String eventData = "@" + timeOfEvent + " this device started ";

if(intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)){

event=new ChargingEvent(eventData+"charging.");

} else if(intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)){

event=new ChargingEvent(eventData+"discharging.");

}

// Post the event

bus.post(event);

}

}

Como puede ver, publicar mensajes en el bus de eventos solo requiere una sola línea de código. Además, el editor no necesita saber nada sobre los suscriptores.

6. Crear clase DisplayActivity

Cree una nueva clase llamada DisplayActivity . Esta clase es responsable de mostrar los mensajes de los eventos publicados en el bus de eventos.

Esta clase también tiene una variable que hace referencia al bus de eventos. Como la biblioteca EventBus sigue el patrón singleton, la instancia del bus de eventos disponible para esta Activity es la misma que la instancia disponible para BroadcastReceiver .

Para permitir que una clase se suscriba a eventos en el bus, se invoca el método de register . En nuestra Activity , lo llamamos en el método onCreate .

Del mismo modo, para dejar de recibir eventos, se invoca el método para unregister el unregister . Llamamos a este método en el método onDestroy para asegurarnos de que se liberan todos los recursos.

La Activity tiene un diseño muy básico, que contiene solo un TextView que muestra los mensajes. Por lo tanto, no es necesario crear un diseño para ello. Simplemente usamos TextView como la vista de contenido de la Activity .

En este punto, la implementación de la clase DisplayActivity debería verse así:

package com.hathy.eventbussample;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

import de.greenrobot.event.EventBus;

public class public DisplayActivity extends Activity {

EventBus bus = EventBus.getDefault(); private EventBus bus = EventBus.getDefault();

TextView view; private TextView view;

@Override

void protected onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

view = new TextView(this);

view.setTextSize(20f);

view.setPadding(20, 20, 20, 20);

view.setText("Waiting for events...");

setContentView(view);

// Register as a subscriber

bus.register(this);

}

@Override

void protected onDestroy() {

// Unregister

bus.unregister(this);

super.onDestroy();

}

}

Cada clase que tiene la intención de recibir eventos del bus de eventos debe contener un método onEvent . El nombre de este método es importante, porque la biblioteca EventBus usa la API Java Reflection para acceder a este método. Tiene un solo parámetro que se refiere al evento. En nuestro caso, el parámetro será del tipo ChargingEvent .

Todo lo que hacemos en este método es agregar el último mensaje recibido al contenido de TextView . La implementación del método onEvent se ve así:

public void onEvent(ChargingEvent event){

view.setText(view.getText() + "\n" + event.getData());

}

7. Ejecutar y probar

La aplicación ahora está lista para ser probada. Compile y ejecútelo en un dispositivo Android físico. Una vez que la aplicación haya terminado de iniciarse, conecte y desconecte el cable de alimentación un par de veces para ver cómo cambia el estado de carga.

Eventbus ayuda a enviar y recibir eventos sin moverse directamente dentro y fuera de las actividades. Sugiero usar greenrobot ya que es eficiente para tratar eventos sin ocupar mucha memoria. Puede encontrarlo aquí: GitHub – greenrobot / EventBus: bus de eventos optimizado para Android que simplifica la comunicación entre Actividades, Fragmentos, Hilos, Servicios, etc. Menos código, mejor calidad.