Android EventBus 介绍

来源:互联网 发布:ip地址与设备mac绑定 编辑:程序博客网 时间:2024/05/29 17:53

———–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

  1. onEvent
  2. onEventMainThread
  3. onEventBackgroundThread
  4. onEventAsync
    这四种的含义,字面意思上就可以理解,EventBus就讲到这里,本篇博客只适合初步了解,你可以在草稿纸上,稍微画一下subscriber,subscriberMethod,subscription,EventType之间的关系,这样会比较清晰,当然啦,如要深入了解,请点下面链接:
    http://www.cnblogs.com/angeldevil/p/3715934.html
    他写的比我好哈哈哈!
0 0
原创粉丝点击