国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

EventBus原理

lsxiao / 1193人閱讀

摘要:實(shí)現(xiàn)了觀察者模式,使用方法非常簡(jiǎn)單,可參考有用的二這篇文章主要講解的實(shí)現(xiàn)原理。一言以蔽之內(nèi)部有一個(gè),當(dāng)時(shí)往中增加一個(gè)元素為事件的類型,為觀察者,時(shí)根據(jù)事件類型找到觀察者之后,對(duì)其反射調(diào)用。

EventBus實(shí)現(xiàn)了觀察者模式,使用方法非常簡(jiǎn)單,可參考:有用的Guava(二)

這篇文章主要講解EventBus的實(shí)現(xiàn)原理。
一言以蔽之:EventBus內(nèi)部有一個(gè)map,當(dāng)register時(shí)往map中增加一個(gè)元素(key為事件的類型,value為觀察者),post時(shí)根據(jù)事件類型找到觀察者之后,對(duì)其反射調(diào)用。
下面我們從register方法開始:

  public void register(Object object) {
    Multimap, EventHandler> methodsInListener =
        finder.findAllHandlers(object);
    handlersByTypeLock.writeLock().lock();
    try {
      handlersByType.putAll(methodsInListener);
    } finally {
      handlersByTypeLock.writeLock().unlock();
    }
  }

調(diào)用eventBus.register(new Event())時(shí),會(huì)將事件類型及觀察者(封裝為EventHandler)放置在SetMultimap, EventHandler> handlersByType中,這是一個(gè)線程安全的對(duì)象容器,卸載事件也是在這個(gè)容器中做移除操作。根據(jù)事件類型查找觀察者時(shí)使用了策略模式,HandlerFindingStrategy finder做為策略接口,目前只有一個(gè)策略實(shí)現(xiàn)AnnotatedHandlerFinder(查找?guī)в蠸ubscribe注解的方法)。
有了這樣一個(gè)map,調(diào)用post時(shí)只需要根據(jù)類型找到觀察者就行了:

  public void post(Object event) {
    Set> dispatchTypes = flattenHierarchy(event.getClass());

    boolean dispatched = false;
    for (Class eventType : dispatchTypes) {
      handlersByTypeLock.readLock().lock();
      try {
        Set wrappers = handlersByType.get(eventType);

        if (!wrappers.isEmpty()) {
          dispatched = true;
          for (EventHandler wrapper : wrappers) {
            enqueueEvent(event, wrapper);
          }
        }
      } finally {
        handlersByTypeLock.readLock().unlock();
      }
    }

    if (!dispatched && !(event instanceof DeadEvent)) {
      post(new DeadEvent(this, event));
    }

    dispatchQueuedEvents();
  }

這里查找到參數(shù)匹配的EventHandler后并沒有立刻執(zhí)行反射調(diào)用,而是分發(fā)到了事件隊(duì)列(ThreadLocal> eventsToDispatch)中,當(dāng)所有事件分發(fā)完畢之后,事件隊(duì)列做統(tǒng)一的事件消費(fèi)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70464.html

相關(guān)文章

  • vue項(xiàng)目中,index.html數(shù)據(jù)與組件之間通信,傳值,以獲取MAC地址為例

    摘要:最近在項(xiàng)目里接手別人的代碼來做完善,其中一個(gè)是修復(fù)獲取不到地址的,仔細(xì)看了下代碼,發(fā)現(xiàn)需要用到控件。所以,演變成文件的數(shù)據(jù)如何跟組件通信。 最近在項(xiàng)目里接手別人的代碼來做完善,其中一個(gè)是修復(fù)獲取不到MAC地址的bug,仔細(xì)看了下代碼,發(fā)現(xiàn)需要用到Activex控件。 上一位同事在寫的時(shí)候把寫在index.html文件中,獲取mac地址的js代碼也寫在了index.html中,讀取完之后...

    zorpan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<