很早之前就知道EventBus了,只不过一直没时间去了解,最近在做一个项目频繁的使用到Activity之间的数据交互,发现使用startActivityForResult是一件非常痛苦的事情,尤其是在多层Activity之间传递数据。正好趁这几天放假,了解了一下EventBus的大概使用方式,写下这篇博客,当做一个总结。
三步走:
- 在EventBus中注册
- 写回调方法
- 发送消息
一、在使用EventBus之前你必须将当前的类(是的,类,常见的就是我们所使用的Activity以及Fragment等)。
// 使用默认的EventBus实例进行注册
EventBus.getDefault().register(this)
当然你也可以重新创建一个EventBus实例进行注册,就像这样:
EventBus eventBus = new EventBus();
eventBus.register(this);
然后别忘了还要在适当的时候进行注销
EventBus.getDefault().unregister(this);
二、为了能够接受到EventBus发送过来的消息,我们得写几个方法,如:
public void onEvent(String msg) {
Logger.e("onEvent:" + msg);
}
public void onEventAsync(String msg) {
Logger.e("onEventAsync:" + msg);
}
public void onEventMainThread(String msg) {
Logger.e("onEventMainThread:" + msg);
}
public void onEventBackgroundThread(String msg) {
Logger.e("onEventBackgroundThread:" + msg);
}
这里有几个要注意的地方
1、方法必须为public,为什么要public?
// Starting with EventBus 2.2 we enforced methods to be public (might change with annotations again)
这是源码中SubscriberMethodFinder类findSubscriberMethods方法中的一段注释,别问我为什么。。。
2、方法名必须要以onEvent开头,后面跟MainThread、BackgroundThread、Async或者就以onEvent为方法名,否则会抛出一个EventBusException异常。(当然,我们可以通过使用EventBusBuilder的方式创建EventBus实例,在创建之前通过调用EventBusBuilder中的skipMethodVerificationFor方法就可以了。)
Ok,也就是说EventBus规定了回调的四种方法名,即:onEvent、onEventMainThread、onEventBackgroundThread、onEventAsync。其实这四种方法的回调是有区别的。下面我们来看看枚举ThreadMode中的几个类型:
/*
* 对应onEvent方法的回调
* 也就是说onEvent会在调用post方法的线程中被回调
* 注:不用切换线程进行调用,开销最小,不过应尽快返回,以免可能阻塞主线程
*/
PostThread,
/*
* 对应onEventMainThread方法的回调
* 在Android主线程(UI线程)中被回调
* 注:尽快返回,以免阻塞主线程
*/
MainThread,
/*
* 对应onEventBackgroundThread方法的回调
* 在主线程中post:会另起一个线程进行回调
* 在线程中post:在post所在的线程中被回调
* 注:使用这种模式时应尽快返回,防止阻塞线程
*/
BackgroundThread,
/*
* 对应onEventAsync方法的回调
* 在一个独立的线程中被回调(独立于主线程以及post方法被调用的线程)
* 注:适用于执行一些耗时操作
*/
Async
好了,知道这几种方法在什么时候被调用,我们就可以根据具体场景选择不同的回调方法。
3、回调方法的参数只能为1个,否则是无法正常回调的
三、调用post发送消息,就像这样:
EventBus.getDefault().post("Msg From SecondActivity in UIThread");
这里注意一下,post方法的参数需要与onEvent系列方法的参数匹配,否则是无法正常回调的。
以下是本人写的一个非常简单的Demo:
https://github.com/asdgbc/AndroidDemos.git
最后,享受EventBus带来的便利吧。
以上。