一、简介
EventBus是一个Android端优化的publish、subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。
二、GitHub地址
https://github.com/greenrobot/EventBus
三、使用步骤
添加依赖:implementation ‘org.greenrobot:eventbus:3.1.1’
1.注册EventBus
private void initData() {
//1、注册广播
EventBus.getDefault().register(MainActivity.this);
}
2.解除注册EventBus,防止内存泄露
@Override
protected void onDestroy() {
super.onDestroy();
//2、解除注册
EventBus.getDefault().unregister(MainActivity.this);
}
3.构造发送消息类
//3.创建发送消息类
public class MessageEvent {
public String name;
public MessageEvent(String name) {
this.name = name;
}
}
4.发布消息
//主线程发送数据按钮点击事件处理
bt_eventbus_send_main.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//4.发送消息
EventBus.getDefault().post(new MessageEvent("主线程发送过来的数据"));
finish();
}
});
5.接收消息
ThreadMode.MAIN表示这个方法在主线程中执行
ThreadMode.BACKGROUND表示该方法在后台执行,不能并发处理
ThreadMode.ASYNC表示在后台执行,可以异步并发处理
ThreadMode.POSTING表示该方法和消息发送方在同一个线程中执行
//5.接收消息
@Subscribe(threadMode = ThreadMode.MAIN)
public void MessageEventBus(MessageEvent event){
tv_eventbus_result.setText(event.name);
}
四、黏性事件
先发送,后注册
1.创建黏性事件类
//1.创建粘性事件类
public class StickyEvent {
public String msg;
public StickyEvent(String msg) {
this.msg = msg;
}
}
2.发送粘性事件
//发送粘性事件到发送页面
btn_eventbus_sticky.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//2.发送粘性事件
EventBus.getDefault().postSticky(new StickyEvent("我是粘性事件"));
//跳转到发送数据页面
Intent intent = new Intent(MainActivity.this, EventBusSendActivity.class);
startActivity(intent);
}
});
3.接收粘性事件
//3.接收粘性事件
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void stickyEventBus(StickyEvent event){
//显示接收的数据
tv_eventbus_send_result.setText(event.msg);
}
4.注册EventBus
//接收粘性事件数据按钮的点击事件处理
//添加标记
private boolean isFirstFlag=true;
bt_eventbus_send_sticky.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isFirstFlag){
isFirstFlag=false;
//4.注册
EventBus.getDefault().register(EventBusSendActivity.this);
}
}
});
注:此处添加标记的原因是为了点击注册一次,防止多次点击注册导致程序崩溃。
5.解除EventBus
@Override
protected void onDestroy() {
super.onDestroy();
//5.解除注册
EventBus.getDefault().unregister(EventBusSendActivity.this);
}