【EventBus】EventBus的基本用法

一、EventBus基本用法

目录

前言

EventBus是一款针对于Android优化的发布-订阅事件总线。它优化了各组件、组件与后台之间的通信,可以用于代替广播实现通信。

1、EventBus要素与ThreadMode

在使用EventBus之前我们首先了解EventBus的三要素和它的五种ThreadMode。

三要素如下:

  • 事件【Event】:可以是任何对象
  • 事件订阅者【Subscriber】:事件订阅者
  • 事件发布者【Publisher】:事件的发布者可以在任意线程发布事件

在这里插入图片描述

EventBus的五种ThreadMode如下:

  • POSTING(默认):如果事件处理函数使用了POSTING模型,那么这个事件在哪发出,事件处理函数就会在哪运行,也就是说发送线程和接受线程在同一个事件当中(意味着最少的开销,因为它完全避免了线程切换。)。 注意:避免耗时操作,因为他会阻塞事件的传递导致ANR
  • MAIN:处理事件会在Ui线程中执行,所以需要避免线程处理时间过长,如果发布线程是主线程,将直接调用订阅者方法,阻塞发布线程。否则,事件将排队等待交付(非阻塞)也就是说事件执行顺序不受控制,可能会与它们被发布的顺序不一致。
  • MAIN_ORDERED:这个模型下,处理事件同样会在 Ui被调用。与 MAIN 不同的是,处理接收该事件是串行的,第二个订阅者需要在第一个订阅者处理完后才会接收到事件,所以被称为 ordered。这个模型同样要避免阻塞主线程。
  • BACKGROUND:处理事件会在后台线程执行, 如果发布事件是Ui线程那么处理事件会新开一个线程,如果发布事件是子线程那么处理事件还是在该子线程。注意:在处理函数禁止Ui操作
  • ASYNC:异步操作,无论事件在哪个线程发布,该事件的处理函数都是会在新的子线程执行;同样在处理函数禁止Ui操作。

2、EventBus的基本用法

首先导入依赖:EventBus项目地址

implementation "org.greenrobot:eventbus:3.3.1"

EventBus的使用分为五步。

(1)、自定义一个事件类

在组件化中通常将这个事件类放在libBase中,并且类的命名加上Event

public class EventMessage {
    
    

    String account;

    public EventMessage(String account) {
    
    
        this.account = account;
    }

    public String getAccount() {
    
    
        return account;
    }

    public void setAccount(String account) {
    
    
        this.account = account;
    }
}

(2)、在需要订阅事件的地方注册事件

事件订阅者通常在onCreate中注册事件

@Override
protected void onCreate(Bundle savedInstanceState) {
    
    
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    viewText = findViewById((int) R.id.logView);
    EventBus.getDefault().register(this);
}

(3)、发送事件

事件发布者在任意地方发布事件

EventBus.getDefault().post(new EventMessage("刚刚从验证界面退出了"));

(4)、处理事件

在刚才订阅事件的类中进行处理事件

@Subscribe(threadMode = ThreadMode.MAIN)
public void showEventMessage(EventMessage message)   {
    
    
    viewText.setText(message.getAccount());
}

处理方法可以随意命名但是需要添加上@Subscribe,并且还要指定线程。

(5)、取消事件订阅

事件订阅者通常在onDestroy中取消事件

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

(6)、ProGuard混淆规则

在项目的混淆文件中,加入EventBus 的混淆规则,这个千万别忘了,不然会出现debug版本测试OK,release版本subscriber 收不到消息等诡异Bug。

-keepattributes *Annotation*
-keepclassmembers class ** {
    
    
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode {
    
     *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    
    
    <init>(java.lang.Throwable);
}

使用后效果展示如下:

3、EventBus的黏性事件

除了发送普通事件外,EventBus还支持发送黏性事件,就是在事件发送后再订阅该事件也可以收到事件。 这和黏性广播类似,我们修改刚才的代码:

(1)、处理黏性事件

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void showEventMessage(EventMessage message)   {
    
    
    viewText.setText(message.getAccount());
}

(2)、发送黏性事件

view.setOnClickListener(new View.OnClickListener() {
    
    
    @Override
    public void onClick(View view) {
    
    
        EventBus.getDefault().postSticky(new EventMessage("刚刚从直播界面退出了"));
        finish();
    }
});

猜你喜欢

转载自blog.csdn.net/m0_72983118/article/details/134938848