EventBus3.0的简单使用

EventBus is a publish/subscribe event bus optimized for Android.意思指的是EventBus是用来优化Android的一个可发布可订阅的事件总线。目前为止EventBus3.0是官方的最新版本。今天我们一起学习EventBus3.0的简单使用。

关于EventBus3.0的使用流程

  1. 注册与反注册
  2. 发布事件以及订阅事件
  3. 发布粘性事件以及订阅粘性时间
  4. 创建一个通用的传递泛型的对象类以及EventConfig类
注册与反注册

想要使用EventBus发布或者订阅事件首先第一步得在相应的Activity或者Fragment里面注册与反注册,当然我只是举个例子。你完全可以在Service或其他组件注册与反注册。如果app多处地方都有用到EventBus订阅时间建议写一个基类Activity或者写一个基类Fragment,在Activity或者是Fragment实现oncreate()、onActivityCreated()以及ondestroy()方法,并且分别做Eventbus的注册与反注册。

EventBus.getDefault().register(this);//注册
EventBus.getDefault().unregister(this);//反注册
发布事件以及订阅事件

通过在Activity或者Fragment注册与反注册之后,我们就可以发布事件以及订阅事件了。在主线程中向已经打开的Activity或者Fragment发送事件,在MainActivity中订阅事件:以下分别是在默认发布线程接收,在主线程接收、在异步线程接收、在后台线程接收。接收的顺序:ASYNC–BACKGROUND–MAIN–POSTING。根据不同情况我们可以通过不同参数在不同线程中订阅事件。

EventBus.getDefault().post(new MessageEvent(EventConfig.POST, "我发给MainActivity的信息"));//发布事件
/**
* 默认发布线程
*
* @param messageEvent
*/
@Subscribe(threadMode = ThreadMode.POSTING)
public void onPostEventBus(MessageEvent messageEvent) {
switch (messageEvent.getEventCode()) {
case EventConfig.POST:
Log.e("IamMainActivity","POSTING"+ (String) messageEvent.getData());
break;
}
}
/**
* 主线程
*
* @param messageEvent
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMainEventBus(MessageEvent messageEvent) {
switch (messageEvent.getEventCode()) {
case EventConfig.POST:
Log.e("IamMainActivity","MAIN"+ (String) messageEvent.getData());
break;
}
}
/**
* 异步线程
*
* @param messageEvent
*/
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onAsyncEventBus(MessageEvent messageEvent) {
switch (messageEvent.getEventCode()) {
case EventConfig.POST:
Log.e("IamMainActivity","ASYNC"+ (String) messageEvent.getData());
break;
}
}
/**
* 后台线程
*
* @param messageEvent
*/
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onBackgroundEventBus(MessageEvent messageEvent) {
switch (messageEvent.getEventCode()) {
case EventConfig.POST:
Log.e("IamMainActivity","BACKGROUND"+ (String) messageEvent.getData());
break;
}
}

发布粘性事件以及订阅粘性事件:

假入我们想要发布一个事件并在还未打开的Activity或者是Fragment中订阅这个事件,这时候我们可以用到发布粘性事件以及订阅粘性事件。意思是ActivityA现在发布一个事件,但是ActivityB还未启动,这时候我们通过发布粘性事件在ActivityB中订阅粘性事件。需要注意的一点是:在接收完粘性事件之后如果没有别的需求最好通过removeStickyEvent(Object object)将这个事件remove掉。否则它会一直保留到最后。粘性事件的订阅顺序:ASYNC–MAIN–POSTING– BACKGROUND。注意的是默认订阅事件是为非粘性事件,即sticky为false。假如我们想要接收粘性事件此时应该在订阅注解参数中添加sticky=true;

//发布粘性事件
EventBus.getDefault().postSticky(new MessageEvent(EventConfig.POST_STICKY, "我发给MainActivity2的信息"));
MainActivity.this.startActivity(new Intent(MainActivity.this, Main2Activity.class));
/**
* 默认
*
* @param messageEvent
*/
@Subscribe(threadMode = ThreadMode.POSTING, sticky = true)
public void onPostEventBus(MessageEvent messageEvent) {
switch (messageEvent.getEventCode()) {
case EventConfig.POST_STICKY:
Log.e("IamMainActivity2","POSTING"+ (String) messageEvent.getData());
EventBus.getDefault().removeStickyEvent(messageEvent);//移除粘性事件
break;
}
}
/**
* 主线程
*
* @param messageEvent
*/
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onMainEventBus(MessageEvent messageEvent) {
switch (messageEvent.getEventCode()) {
case EventConfig.POST_STICKY:
Log.e("IamMainActivity2","MAIN"+ (String) messageEvent.getData());
EventBus.getDefault().removeStickyEvent(messageEvent);//移除粘性事件
break;
}
}
/**
* 异步线程
*
* @param messageEvent
*/
@Subscribe(threadMode = ThreadMode.ASYNC, sticky = true)
public void onAsyncEventBus(MessageEvent messageEvent) {
switch (messageEvent.getEventCode()) {
case EventConfig.POST_STICKY:
Log.e("IamMainActivity2","ASYNC"+ (String) messageEvent.getData());
EventBus.getDefault().removeStickyEvent(messageEvent);//移除粘性事件
break;
}
}
/**
* 后台线程
*
* @param messageEvent
*/
@Subscribe(threadMode = ThreadMode.BACKGROUND, sticky = true)
public void onBackgroundEventBus(MessageEvent messageEvent) {
switch (messageEvent.getEventCode()) {
case EventConfig.POST_STICKY:
Log.e("IamMainActivity2","BACKGROUND"+ (String) messageEvent.getData());
EventBus.getDefault().removeStickyEvent(messageEvent);//移除粘性事件
break;
}
}

创建一个通用的传递泛型的对象类以及EventConfig类

/**
* EventBus 传递数据对象
* Created by zhangyuting on 2016/4/6.
*/
public class MessageEvent<T> {
public static String TAG = "MessageEvent";
/**
* reserved data
*/
private T data;
/**
* this code distinguish between different events
*/
private int eventCode = -1;
public MessageEvent(int eventCode) {
this(eventCode, null);
}
public MessageEvent(int eventCode, T data) {
this.eventCode = eventCode;
this.data = data;
}
/**
* get event code
*
* @return
*/
public int getEventCode() {
Log.i(TAG, String.valueOf(eventCode));
return this.eventCode;
}
/**
* get event reserved data
*
* @return
*/
public T getData() {
Log.i(TAG, String.valueOf(data));
return this.data;
}
}
/**
* EventBus 相关变量
* Created by zhangyuting on 2016/4/6.
*/
public class EventConfig {
public static final int POST = 10;
public static final int POST_STICKY = 11;
}

这就是EventBus3.0的简单实用步骤。

坚持原创技术分享,您的支持将鼓励我继续创作!