Event Bus是一个发布 / 订阅的事件总线。
Event Bus模式 — 也被称为Message Bus或者发布者/订阅者(publisher/subscriber)模式
— 可以让两个组件相互通信,但是他们之间并不相互知晓。
基于事件总线管理/订阅/分发模式的。事件响应有更多的线程选择,
EventBus可以向不同的线程中发布事件。EventBus支持 Sticky Event。
使用时需要先注册订阅,然后向订阅者分发消息数据即可。
包含4个成分:发布者,订阅者,事件,总线。订阅者可以订阅多个事件,
发送者可以发布任何事件,发布者同时也可以是订阅者。分订阅、注册、发布、取消注册等步骤。
Event Bus的基本用法
分订阅、注册、发布、取消注册。
注册:
EventBus.getDefault().register(this);
EventBus.getDefault().register(new MyClass());
//注册:三个参数分别是,消息订阅者(接收者),接收方法名,事件类
EventBus.getDefault().register(this,"setTextA",SetTextAEvent.class);
取消注册:
EventBus.getDefault().unregister(this);
EventBus.getDefault().unregister(new MyClass());
订阅处理数据:
public void onEventMainThread{}
public void onEvent(AnyEventType event) {}
onEventPostThread、onEventBackgroundThread、onEventAsync
发布:
EventBus.getDefault().postSticky(new SecondActivityEvent("Message From SecondActivity"));
EventBus.getDefault().post(new ChangeImgEvent(1));
下面是一个例子:
1导jar包
2核心代码:
一、基本用法
发消息:
EventBus.getDefault().post(new Zhh("消息FourActivity"));
其他页面接收消息
/**
* 在 onCreate 中注册
* @param savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_three);
EventBus.getDefault().register(this);
}
/**
* 在 onDestroy 中取消注册
*/
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
/**
* 接收消息
* 注意eventbus3.0的jar包要加@Subscribe
*/
@Subscribe
public void onEvent(Zhh zhh){
Logger.t("111").d("接收到的消息是"+zhh.getName());
}
实体类
package com.zhh.android;
/**
* 实体类
*/
public class Zhh {
private String name;
public Zhh(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
二、Sticky Event - 粘性事件
在Android开发中,Sticky事件只指事件消费者在事件发布之后才注册的也能接收到该事件的特殊类型。Android中就有这样的实例,也就是Sticky Broadcast,即粘性广播。正常情况下如果发送者发送了某个广播,而接收者在这个广播发送后才注册自己的Receiver,这时接收者便 无法接收到刚才的广播,为此Android引入了StickyBroadcast,在广播发送结束后会保存刚刚发送的广播(Intent),这样当接收者注册完Receiver 后就可以接收到刚才已经发布的广播。这就使得我们可以预先处理一些事件,让有消费者时再把这些事件投递给消费者。
发消息:
EventBus.getDefault().postSticky("首页消息");
接收消息
/**
* 在onCreate 注册
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
EventBus.getDefault().register(this);
}
/**
* 在onDestroy中取消注册
*/
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
/**
* 接收消息
*/
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEvent(String zifuchuan) {
TextView textView = findViewById(R.id.textView);
textView.setText(zifuchuan);
}
三、线程模式 ThreadMode
消息在那个线程中接收
常用的两个:ThreadMode.MAIN主线程,ThreadMode.ASYNC子线程
在子线程中接收(在注解中标识)
/**
* 接收消息
* 注意eventbus3.0的jar包要加@Subscribe
*/
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onEvent(Zhh zhh){
Logger.t("111").d("接收到的消息是"+zhh.getName());
}
在主线程中接收(在注解中标识)
/**
* 接收消息
* 注意eventbus3.0的jar包要加@Subscribe
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(Zhh zhh){
Logger.t("111").d("接收到的消息是"+zhh.getName());
}
源码下载:
http://download.csdn.net/detail/zhaihaohao1/9563601
EventBus实现fragment之间传递数据
http://download.csdn.net/detail/zhaihaohao1/9563663
参考文章:
https://blog.csdn.net/IO_Field/article/details/52185717