Android-EventBus
首先,EventBus顾名思义,就是一个事件总线,简化了很多事件处理的繁琐代码,例如Handler。介绍分两步,一步是用例,一步是源码解析,相对于网上的教程,我的比较简单,适合初步了解。
1、用例
public class TestA extends Activity{
public void onCreated(Bundle savedInstanceState){ EventBus eventbus=EventBus.getDefault(); eventbus.register(this); runtest();}public void onEvent(FinishEvent event){ //事件 event 处理代码}
public void runtest(){ eventbus.post(new FinishEvent);}
public class FinishEvent{}
这就是一个简单的用例了,在TestA中:
1、用EventBus.getDefault()得到EventBus对象
2、使用register方法注册当前TestA,并在TestA中建立onEvent()方法
3、使用post将事件FinishEvent加入到EventBus的总线上,系统将会自动执行onEvent()方法
2、下面结合源码对上述例子进行解析:
首先我们看register(this)方法:
private synchronized void register(Object subscriber, boolean sticky, int priority) { List<SubscriberMethod> subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriber.getClass()); for (SubscriberMethod subscriberMethod : subscriberMethods) { subscribe(subscriber, subscriberMethod, sticky, priority); } }
传进来的subscriber,也就是我们的TestA对象, findSubscriberMethods(subscriber.getClass())中,是得到TestA对象中,所有类似于onEvent的方法(subscriberMethod)。
可以看到,我们的onEvent方法,只包含了一个参数,源码中,把subscriberMethod的参数叫做EventType,所以,我们可以推断中,一个subscriber中,可以对应多个subscriberMethod,一个subscriberMethod,对应一个EventType。
接下来看register(this)中的subscribe方法,可以看到,每个subscriber的subsriberMethod都要执行一次这个函数,在这个函数里,出现了subscription(subscriber,subscribermethod),看定义函数就知道一个subscription对应着一个subscriber和一个subscriber中的一个method。这个函数就是用已有的subscriber和method产生subscription。
弄清楚subscriber,subscription,subscriberMethod和EventType的关系就很好办了,再看源码就非常之easy。接下来让我们轻松的看post函数:
public void post(Object event) { PostingThreadState postingState = currentPostingThreadState.get(); List<Object> eventQueue = postingState.eventQueue; eventQueue.add(event); ............... while (!eventQueue.isEmpty()) { postSingleEvent(eventQueue.remove(0), postingState); } ......... }
这是一部分关键代码,eventQueue很容易知道就是一个事件排队,就像收银台一样一个一个去执行。传入的是Event,也就是EventType参数。
为什么要传入EventType参数呢?
因为,EventBus的原理就是根据传入的EventType参数,找到所有scription中此EventType对应的subscriptionMethod,然后去执行它,也就是说,假设subsriberA和subsriberB,都含有onEvent(FinishEvent e),那么当你传入new FinishEvent()的时候,subscriberA和B的方法都会执行!看到这里是不是清楚了很多?
接下来进入postingSingleEvent(EventType e)
代码不难,主要就是根据函数名字来选择在什么线程上执行这个函数。在例子中,subscriberMethod的名字为onEvent(),实际上,这个名字是有相关规定的,分四种,这四种分别决定了subscriberMethod对象中的一个属性—ThreadMode
- onEvent
- onEventMainThread
- onEventBackgroundThread
-
onEventAsync
这四种的含义,字面意思上就可以理解,EventBus就讲到这里,本篇博客只适合初步了解,你可以在草稿纸上,稍微画一下subscriber,subscriberMethod,subscription,EventType之间的关系,这样会比较清晰,当然啦,如要深入了解,请点下面链接:
http://www.cnblogs.com/angeldevil/p/3715934.html
他写的比我好哈哈哈!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于