github地址:[https://github.com/greenrobot/EventBus](https://github.com/greenrobot/EventBus)
#### 添加依赖
~~~
compile 'org.greenrobot:eventbus:3.1.1'
~~~
#### 定义传递对象
当然如果你传递的是String类型这种,就不用定义这个了。方法名称任意,比如Student。
~~~
public static class MessageEvent { /* Additional fields if needed */ }
~~~
#### 注册和解除注册
~~~
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
~~~
以上是github上推荐的方式,当然也可以放到onCreate和onDestroy中,比如这种。
~~~
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
if(EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this);
}
}
~~~
#### 发送事件
一行代码即可,参数就是定义的实体类(或者是个String类型这种)
~~~
EventBus.getDefault().post(messageEvent);
~~~
#### 接收事件
接收事件的方法名称任意,但是必须添加注解@Subscribe,同时接收参数类型要和发送的一致。比如有两个接收方法,会找到参数一致的来执行。
~~~
@Subscribe(threadMode = ThreadMode.POSTING)
public void test(MessageEvent messageEvent) {
TextView tv = findViewById(R.id.tv);
tv.setText(messageEvent.getMessage());
}
~~~
上面注解有个线程模型POSTING,这个是默认的。EventBus3.0有四种线程模型,分别是:
~~~
POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
~~~