Explicación detallada del uso de EventBus en la biblioteca de código abierto

Introducción

EventBus es un bus de eventos de publicación / suscripción para Android. Simplifica la comunicación entre componentes, componentes y subprocesos en segundo plano en la aplicación. A menudo se utiliza para comunicar y transferir datos entre Actividad, Fragmento y Servicio en segundo plano.

Dirección de GitHub: https://github.com/greenrobot/EventBus

API

eventbus

Como bus de mensajes, hay tres componentes principales: evento (evento), suscriptor de evento (suscriptor) y editor de eventos (editor).

usar

  • Agregue la dependencia EventBus en el script de compilación build.gradle del módulo
dependencies {
    ...
   implementation 'org.greenrobot:eventbus:3.1.1'
}
  • Defina el evento, el evento puede ser cualquier objeto Java ordinario sin requisitos especiales
public class MessageEvent {

    private String msg;

    public MessageEvent(String msg) {
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}
  • Suscríbete a eventos
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_bus);
        //  注册订阅者
        EventBus.getDefault().register(this);
    }

    // 事件处理方法
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMainEvent(MessageEvent event) {
        Log.e(TAG, "onMainEvent方法接收的数据---->" + event.getMsg());
    }

     // 注销订阅者
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
  • Publique eventos, publique eventos donde sea necesario, y todos los suscriptores registrados que se hayan suscrito a este tipo de evento recibirán el evento.
   EventBus.getDefault().post(new MessageEvent("main"));

Modo de hilo

Utilice el modo de subproceso para especificar el subproceso del método de suscriptor

  1. ThreadMode.POSTING

    El método de suscriptor se llamará en el hilo donde se publica el evento. Este es el modo de hilo predeterminado. La entrega de eventos es síncrona. Una vez que se publica un evento, se llamarán todos los métodos de suscriptor de este modo. Este modo de subprocesos significa la menor sobrecarga de rendimiento, ya que evita el cambio de subprocesos. Por lo tanto, este modo se recomienda para tareas simples que no requieren el hilo principal y toman poco tiempo. Los métodos de suscriptor que usan este patrón deben regresar rápidamente para evitar bloquear el hilo que publica el evento, que puede ser el hilo principal.

  2. ThreadMode.MAIN

    El método del suscriptor se llamará en el hilo principal (hilo de la interfaz de usuario). Por lo tanto, puede actualizar directamente la interfaz de usuario en el método de suscriptor de este modo. Si el hilo que publica el evento es el hilo principal, entonces se llamará directamente al método de suscriptor de este modo. Los métodos de suscriptor que usan este patrón deben regresar rápidamente para evitar bloquear el hilo principal.

  3. ThreadMode.MAIN_ORDERED

    El método del suscriptor se llamará en el hilo principal (hilo de la interfaz de usuario). Por lo tanto, puede actualizar directamente la interfaz de usuario en el método de suscriptor de este modo. El evento ingresará a la cola antes de ser enviado al suscriptor, por lo que la llamada para publicar el evento regresará de inmediato. Esto mantiene el procesamiento de eventos en un estricto orden de serie. Los métodos de suscriptor que usan este modo deben regresar rápidamente para evitar bloquear el hilo principal

  4. ThreadMode.BACKGROUND

    El método del suscriptor se llamará en un hilo en segundo plano. Si el hilo que publica el evento no es el hilo principal, entonces el método del suscriptor será llamado directamente en ese hilo. Si el hilo que publicó el evento es el hilo principal, entonces se usará un hilo de fondo separado, que enviará todos los eventos en secuencia. Los métodos de suscriptor que usan este patrón deberían regresar rápidamente para evitar bloquear los hilos en segundo plano.

  5. ThreadMode.ASYNC

    El método del suscriptor se llamará en un hilo separado. Por tanto, la convocatoria para publicar el evento volverá de inmediato. Si la ejecución del método de abonado requiere algún tiempo, como el acceso a la red, entonces se debe utilizar este modo. Evite activar una gran cantidad de métodos de suscriptor de larga ejecución para limitar la cantidad de subprocesos simultáneos. EventBus usa un grupo de subprocesos para reutilizar de manera efectiva los subprocesos que han terminado de llamar a los métodos de suscriptor.

Ejemplo concreto

  • ThreadMode.POSTING
// 在EventBusActivity 中进行注册订阅、处理订阅者方法、注销订阅
public class EventBusActivity extends AppCompatActivity {
    
    
  private static final String TAG = EventBusActivity.class.getSimpleName();
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_bus);
        //  注册订阅者
        EventBus.getDefault().register(this);
    }

    // 事件处理方法
    @Subscribe(threadMode = ThreadMode.POSTING)
    public void onPostingEvent(MessageEvent event) {
        Log.e(TAG, "onPostingEvent方法接收的数据---->" + event.getMsg()+ "---所在线程---->" + Thread.currentThread().getName());
    }

     // 注销订阅者
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}


//  在EventSecondActivity 进行发送事件
public class EventSecondActivity extends AppCompatActivity implements View.OnClickListener {
    
    
    private static final String TAG = EventSecondActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_second);

        Button btn = findViewById(R.id.btn);
        btn.setOnClickListener(this);
    }
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn:
                // 在main 主线程调用
                EventBus.getDefault().post(new MessageEvent("posting"));
                break;
         }
    }
}

resultado:
Escriba la descripción de la imagen aquí

  • ThreadMode.MAIN
// EventBusActivity 代码
......

 @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMainEvent(MessageEvent event) {

        Log.e(TAG, "onMainEvent方法接收的数据---->" + event.getMsg() + "---所在线程---->" + Thread.currentThread().getName());
    }

.......

// EventSecondActivity 进行发送事件
.......

EventBus.getDefault().post(new MessageEvent("main"));
  • ThreadMode.BACKGROUND
// EventBusActivity 代码
   @Subscribe(threadMode = ThreadMode.BACKGROUND)
    public void onBackgroundEvent(MessageEvent event) {
        Log.e(TAG, "onBackgroundEvent方法接收的数据---->" + event.getMsg() + "---所在线程---->" + Thread.currentThread().getName());
    }

 // EventSecondActivity 进行发送事件
 new Thread(new Runnable() {
     @Override
     public void run() {
      EventBus.getDefault().post(new MessageEvent("background"));
         Log.e(TAG, "---所在线程为--->" + Thread.currentThread().getName());
      }
 }).start();

resultado:
Escriba la descripción de la imagen aquí

  • ThreadMode.ASYNC
// EventBusActivity 代码
 @Subscribe(threadMode = ThreadMode.ASYNC)
    public void onAsyncEvent(MessageEvent event) {
        Log.e(TAG, "onAsyncEvent 方法接收的数据---->" + event.getMsg() + "---所在线程---->" + Thread.currentThread().getName());
    }
// EventSecondActivity 进行发送事件
 EventBus.getDefault().post(new MessageEvent("async"));

resultado:
Escriba la descripción de la imagen aquí

Prioridad de evento

EventBus admite la especificación de la prioridad de entrega de eventos al definir métodos de suscriptor. De forma predeterminada, la prioridad de entrega de eventos del método de suscriptor es 0. Cuanto mayor sea el valor, mayor será la prioridad. En el mismo modo de hilo, los métodos de suscriptor de mayor prioridad recibirán eventos primero

// EventBusActivity 代码
@Subscribe(threadMode = ThreadMode.MAIN, priority = 1)
    public void onMainEvent(MessageEvent event) {

        Log.e(TAG, "onMainEvent方法接收的数据---->" + event.getMsg() + "---所在线程---->" + Thread.currentThread().getName());
    }

    @Subscribe(threadMode = ThreadMode.MAIN, priority = 2)
    public void onMainEvent_2(MessageEvent event) {
        Log.e(TAG, "onMainEvent_2方法接收的数据---->" + event.getMsg() + "---所在线程---->" + Thread.currentThread().getName());
    }

    @Subscribe(threadMode = ThreadMode.MAIN, priority = 3)
    public void onMainEvent_3(MessageEvent event) {

        Log.e(TAG, "onMainEvent_3方法接收的数据---->" + event.getMsg() + "---所在线程---->" + Thread.currentThread().getName());
    }

Nota: la prioridad solo es válida en el mismo modo de hilo.
resultado:
Escriba la descripción de la imagen aquí

Evento pegajoso

Si el evento se publica primero y luego un suscriptor se suscribe al evento, el suscriptor nunca recibirá el evento a menos que el evento se vuelva a publicar. En este punto, se pueden utilizar eventos fijos. Después de publicar un evento fijo, EventBus almacenará en caché el evento fijo en la memoria. Cuando un suscriptor se suscribe al evento fijo, el suscriptor recibirá el evento.

Ejemplo:

// EventBusActivity 代码
TextView tv_sticky = findViewById(R.id.tv_sticky);
tv_sticky.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EventBus.getDefault().postSticky(new MessageEvent("sticky"));
            }
  });

 Button btn = findViewById(R.id.btn);
 btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
       Intent intent = new Intent(EventBusActivity.this, EventSecondActivity.class);
       startActivity(intent);
    }
 });

// EventSecondActivity
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_second);
        EventBus.getDefault().register(this);
  }

  @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void onStickyEvent(MessageEvent event) {
        Log.e(TAG,"onStickyEvent 粘性事件接收---------->"+event.getMsg());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);

    }

resultado:
Escriba la descripción de la imagen aquí

API relacionada:

  • removeStickyEvent (evento de objeto)
    elimina el evento fijo especificado
  • removeStickyEvent (Class eventType);
    elimina el tipo especificado de evento pegajoso
  • removeAllStickyEvents ();
    elimina todos los eventos pegajosos

Complemento EventBus

El proyecto utiliza EventBus y varios eventos son caóticos. Este complemento es muy fácil de usar para los eventos del proyecto.

  • 在 Configuración de AndroidStudio ——–> Complementos
    Escriba la descripción de la imagen aquí
  • Haga clic en el pequeño icono de publicación del evento, se enumerarán directamente todos los lugares recibidos
    Escriba la descripción de la imagen aquí
  • Al hacer clic en el icono de recibir eventos, se enumerarán directamente todos los lugares que enviaron eventos:
    Escriba la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/xufei5789651/article/details/82667995
Recomendado
Clasificación