成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

EventBus原理

lsxiao / 1205人閱讀

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

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

這篇文章主要講解EventBus的實現(xiàn)原理。
一言以蔽之:EventBus內(nèi)部有一個map,當register時往map中增加一個元素(key為事件的類型,value為觀察者),post時根據(jù)事件類型找到觀察者之后,對其反射調(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())時,會將事件類型及觀察者(封裝為EventHandler)放置在SetMultimap, EventHandler> handlersByType中,這是一個線程安全的對象容器,卸載事件也是在這個容器中做移除操作。根據(jù)事件類型查找觀察者時使用了策略模式,HandlerFindingStrategy finder做為策略接口,目前只有一個策略實現(xiàn)AnnotatedHandlerFinder(查找?guī)в蠸ubscribe注解的方法)。
有了這樣一個map,調(diào)用post時只需要根據(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ā)到了事件隊列(ThreadLocal> eventsToDispatch)中,當所有事件分發(fā)完畢之后,事件隊列做統(tǒng)一的事件消費。

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70464.html

相關文章

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

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

    zorpan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<