参考资料:
http://greenrobot.org/eventbus/documentation/how-to-get-started/
http://blog.csdn.net/harvic880925/article/details/40660137
http://blog.csdn.net/yuanzeyao/article/details/38174537
http://a.codekk.com/detail/Android/Trinea/EventBus%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90
https://github.com/greenrobot/EventBus
示例程序:
https://github.com/saragitshare/EventBusDemo.git
1 EventBus是基于订阅和发布的一种通信机制,使用流程如下:
注册订阅者 : 注册接受event的Object。 例如: EventBus.getDefault().register(this);
发布消息 : 发布Event。例如:EventBus.getDefault().post(new Long(1000));
接受消息: 接受Event,并处理。例如:EventBus.getDefault().post(new Long(1000));
2 Activity 接受EventBus的消息,要注册以及及时注销该Activity Object。
通常在onCreate中注册:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.eventbus_demo_layout);
ButterKnife.inject(this);
EventBus.getDefault().register(this);
}
通常在onStop或者onDestroy注销:
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
super.onDestroy();
}
3、
Fragment 接受EventBus的消息,要注册以及及时注销该Fragment Object。
通常在onCreateView或者onStart中注册, 在onStop或者onDestroy中注销。
4 EventBus接受和处理消息(事件==消息)的模式有4种。
(1) eventbus-3.3.0
ThreadMode.POSTING:
发布事件和接收事件线程在同一个线程。默认可以不加Subscribe标识。
ThreadMode.MAIN: 发送方= 任何一个线程(包括主线程),接收方 =
UI线程。
ThreadMode.BACKGROUND: 如果发送方=
UI线程,接收方 = 子线程。 如果发送方=
子线程,接收方 = 同一个子线程。
ThreadMode.POSTING: 发送方= 任何一个线程(包括主线程),接收方 =
新的子线程。
说明:
eventbus-3.3.0中,订阅函数的必须添加“@Subscribe(threadMode = ThreadMode.POSTING)标识”
eventbus-3.3.0中,订阅函数的名称可以是任意的。
(2) 在eventbus-2.2.1中,
onEvent : 发布事件和接收事件线程在同一个线程。
onEventMainThread : 发送方= 任何一个线程(包括主线程),接收方 = UI线程。
onEventBackgroundThread : 如果发送方= UI线程,接收方 = 子线程。 如果发送方=
子线程,接收方 = 同一个子线程。
onEventAsync 发送方= 任何一个线程(包括主线程),接收方 =
新的子线程。
说明:
eventbus-2.2.1中,4种模式的对应订阅函数名是固定的。
eventbus-2.2.1中,4种模式的对应eventbus-3.3.0,只用方法上有点区别。
5、eventbus:3.0.0的行为完全不同于eventbus-2.2.1。原来不知道是作者修改了行为,还是引入了重大bug,后来发现是作者为了使用越规范和方便,增加了Subscribe标识。
6、Lib库的升级要严格测试,以免发生类似该demo种的问题。