一、EventBus基本用法
目录
- 前言
- 1、EventBus要素与ThreadMode
- 2、EventBus的基本用法
- 3、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();
}
});