注:EventBus在github上的使用
https://github.com/greenrobot/EventBus
概念:
EventBus是一个发布/订阅的事件总线。它可以让两个组件相互通信,但是它们之间并不相互知晓。 EventBus模式,也被称为 Message Bus模式,
或者 发布者/订阅者(publisher/subscriber)模式。 事件响应有更多的线程选择,EventBus 可以向不同的线程中发布事件。
这里需要理解的是发送事件可以在任何线程中进行,但接收事件需要在特定的线程中处理。你想在哪个线程注册就在哪个线程接收事件,可以是多个
地方接收事件消息。哪里有数据,我们可以直接传入事件消息,消息类型是我们自己可以定义的。
传统的传递和EventBus的比较:(四大组件之间传递参数)
Handler、BroadCastReceiver、intent、Interface 回调,相比之下 EventBus 的优点是代码简洁,使用简单,并将事件发布和订阅充分解耦。
EventBus使用:
第一步:gradle
compile 'org.greenrobot:eventbus:3.0.0'
第二步:讲解根据生命周期进行取消和注册订阅者
例如:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
第三步:定义事件
public static class MessageEvent { /* Additional fields if needed */ }
第四步:发布事件(两种方法)
需要在你需要获取数据的地方发布事件:
普通事件:EventBus.getDefault().post(new MessageEvent());
粘性事件:EventBus.getDefault().postSticky(new MessageEvent("test"));
第五步:接收事件(四种)
注意:在注解的里面是含有优先级的,在注解上加上 priority = 优先级数(int值)下面是普通的事件接收,要想接收粘性事件,添加一个参数
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true),根据不同的注解可以分别接收粘性事件,默认就是非粘性事件,
如果是粘性事件,只需要在事件的注解上面加上。
(1)那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为
PostThread的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。默认是这个线程
@Subscribe(threadMode = ThreadMode.POSTING, priority = 1)
public void onMessageEventPostThread(MessageEvent messageEvent) {
Log.e("PostThread", Thread.currentThread().getName());
}
(2)那么不论事件是在哪个线程中发布出来的,该事件处理函数都会在UI线程中执行。该方法可以用来更新UI,但是不能处理耗时操作。
@Subscribe(threadMode = ThreadMode.MAIN, priority = 2)
public void onMessageEventMainThread(MessageEvent messageEvent) {
Log.e("MainThread", Thread.currentThread().getName());
}
(3)那么如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件
处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
@Subscribe(threadMode = ThreadMode.BACKGROUND, priority = 3)
public void onMessageEventBackgroundThread(MessageEvent messageEvent) {
Log.e("BackgroundThread", Thread.currentThread().getName());
}
(4)那么无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行。同样,此事件处理函数中禁止进行UI更新操作。
@Subscribe(threadMode = ThreadMode.ASYNC, priority = 4)
public void onMessageEventAsync(MessageEvent messageEvent) {
Log.e("Async", Thread.currentThread().getName());
}