Android EventBus 介绍

———–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
    他写的比我好哈哈哈!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值