###一、什么是EventBus
EventBus是Android下高效的发布/订阅事件总线机制。作用是可以代替传统的Intent、Handler、Broadcast或接口回调函数,在Fragment、Activity、Service以及线程之间去传递数据、执行方法。
EventBus的特点是代码简洁,它是一种发布订阅设计模式(Publish/Subsribe),或称作观察者设计模式。使用EventBus可以让模块与模块之间解耦。
####官方地址:https://github.com/greenrobot/EventBus
###二、如何获取
- Github主页:https://github.com/greenrobot/EventBus下载源码自行编译jar包
- AndroidStudio中之间所有maven依赖eventbus或者build.gradle中添加依赖:
compile ‘de.greenrobot:eventbus:2.4.0’
###三、EventBus基本使用(三个步骤)
####步骤一:定义一个Event
//随便定义一个类
public class Event {
public String msg;//定义一个参数
}
####步骤二:注册 & 注销 订阅者
- 在该界面所在的oncrete()方法中添加:
EventBus.getDefault().register(this);//注册一个接收
- 实现订阅方法,主要是重写四个方法:
public void onEvent(Event event) {
// 接收到事件之后,打印message信息
Log.i(TAG,"receive onEvent ===" + event.msg+"当前线程"+Thread.currentThread());
}
public void onEventMainThread(Event event) {
// 接收到事件之后,打印message信息
Log.i(TAG,"receive onEventMainThread ===" + event.msg+"当前线程"+Thread.currentThread());
}
public void onEventBackgroundThread(Event event) {
// 接收到事件之后,打印message信息
Log.i(TAG,"receive onEventBackgroundThread ===" + event.msg+"当前线程"+Thread.currentThread());
}
public void onEventAsync(Event event) {
// 接收到事件之后,打印message信息
Log.i(TAG,"receive onEventAsync ===" + event.msg+"当前线程"+Thread.currentThread());
}
#####步骤三:发布者发布事件
Event event1 = new Event();//该Event 就是我们之前创建的一个类
event1.msg = "我是来自TestEvent的消息";
EventBus.getDefault().post(event1);//在子线程中发布消息
###四、EventBus基本测试
####1、当我们在同一个Activity中注册监听,并发布事件时:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_2:
// 发布事件
*//* Event event1 = new Event();
event1.msg = "我是来自TestEvent的消息";
EventBus.getDefault().post(event1);//在子线程中发布消息*//*
break;
}
return super.onKeyDown(keyCode, event);
}
当我们点击键盘的“2”时,Android Monitor会打印如下的提示:
####2、当我们在同一个Activity中注册监听,并在其创建一个子线程发布事件时:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_2:
// 发布事件
new Thread(new Runnable() {
@Override
public void run() {
*//* Event event1 = new Event();
event1.msg = "我是来自TestEvent的消息";
EventBus.getDefault().post(event1);//在子线程中发布消息*//*
}
}).start();
break;
}
return super.onKeyDown(keyCode, event);
}
打印的消息如下:
####3、当我们在同一个Activity中注册监听,在另一个Activity中发布事件时:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_2:
// 发布事件
Event event1 = new Event();
event1.msg = "我是来自TestEvent的消息";
EventBus.getDefault().post(event1);//在子线程中发布消息
break;
}
return super.onKeyDown(keyCode, event);
}
- 直接跳转到B界面
这个时候我们由Main界面跳转到B界面,但是我们仍然在Main中打印信息(作为接受者)。如果我们直接点击调转,然后按“2”发布事件时,打印如下:
2.跳转后,我们点击返回键,然后再次跳转后显示:
五、EventBus四个方法讲解
总结:
通过上面的四个方法的分析,我们结合上面的测试,我们再次详细讲解四个关键方法的使用。
-
onEvent:
如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。 -
onEventMainThread
如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。 -
onEventBackgroundThread
使用onEventBackgrond作为订阅函数,如果发布者是子线程则直接执行;如果发布者不是子线程,则创建一个子线程再执行。 -
onEventAsync
使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程再执行。适用于多个线程任务处理,内部由线程池管理。
至此,对于EventBus的详细使用我们先讲解到这里,对于源码的分析,我会在下个博文中为大家讲解,欢迎大家关注。