EventBus系列『二』——Post與postSticky事件的發(fā)布與接收

上一篇我們針對(duì)EventBus注冊(cè)注銷(xiāo)做了源碼剖析捎琐,通過(guò)流程圖和對(duì)源碼的剖析,應(yīng)該對(duì)上述流程有了一定了解.
接下來(lái)我們將會(huì)對(duì)Post事件發(fā)布與接收postSticky事件發(fā)布與接收 展開(kāi)剖析否彩,我們將會(huì)提出幾個(gè)問(wèn)題,讓我們帶著問(wèn)題去剖析這兩個(gè)事件的流程嗦随。

我的EventBus系列的其他文章地址

EventBus系列『一』——注冊(cè)與注銷(xiāo)

EventBus系列『二』——Post與postSticky事件的發(fā)布與接收

EventBus系列『番外』——認(rèn)真剖析 『PendingPostQueue』隊(duì)列的實(shí)現(xiàn)思想

問(wèn)題

    1. Post事件postSticky事件的使用場(chǎng)景
    1. Post事件postSticky事件的區(qū)別
    1. postSticky事件實(shí)現(xiàn) 粘性的原理

剖析

Post事件發(fā)布

我們先上一張Post事件發(fā)布流程圖:

EventBus_Post事件.jpg

我們根據(jù)流程圖的執(zhí)行流程列荔,開(kāi)始我們的對(duì)源碼的剖析:

public void post(Object event) {
   //從ThreadLocal?中獲取PostingThreadState類(lèi)實(shí)例
    PostingThreadState postingState = currentPostingThreadState.get();
   //獲取PostingThreadState的屬性?
    List<Object> eventQueue = postingState.eventQueue;
    //將event事件添加到eventQueue隊(duì)列?
    eventQueue.add(event);?
    if (!postingState.isPosting) {
        //設(shè)置PostingThreadState的isMainThread屬性?
        postingState.isMainThread = isMainThread();
        //設(shè)置PostingThreadState的isPosting屬性?
        postingState.isPosting = true;
        if (postingState.canceled) {
            throw new EventBusException("Internal error. Abort state was not reset");
        }
        try {
            //遍歷eventQueue隊(duì)列?
            while (!eventQueue.isEmpty()) {
                 //[ 1 ]  ?遍歷隊(duì)列,逐一對(duì)隊(duì)列中的元素執(zhí)行發(fā)布 參數(shù)中 [ eventQueue.remove(0) ] 方法會(huì)將隊(duì)列下的指定位置的元素移除枚尼,并返回被移除的元素值
                postSingleEvent(eventQueue.remove(0), postingState);
            }
        } finally {
            postingState.isPosting = false;
            postingState.isMainThread = false;
        }
    }
}
  • 1.從ThreadLocal?中獲取PostingThreadState類(lèi)實(shí)例
    1. ?遍歷隊(duì)列贴浙,逐一對(duì)隊(duì)列中的元素執(zhí)行發(fā)布 參數(shù)中 eventQueue.remove(0) 方法會(huì)將隊(duì)列下的指定位置的元素移除,并返回被移除的元素值
    1. 最后重置 postingState 狀態(tài)屬性

[ 1 ] ?遍歷隊(duì)列署恍,逐一對(duì)隊(duì)列中的元素執(zhí)行發(fā)布,進(jìn)入postSingleEvent(eventQueue.remove(0), postingState) 方法

private void postSingleEvent(Object event, PostingThreadState postingState) throws Error {
    //獲取事件的類(lèi)型class?
    Class<?> eventClass = event.getClass();
    boolean subscriptionFound = false;
    //判定是否是繼承事件?
    if (eventInheritance) {
        //獲取類(lèi)型class的父類(lèi)集合?
        List<Class<?>> eventTypes = lookupAllEventTypes(eventClass);
        int countTypes = eventTypes.size();
         //遍歷類(lèi)型class的父類(lèi)集合?
        for (int h = 0; h < countTypes; h++) {
            Class<?> clazz = eventTypes.get(h);
             //[ 2] 為事件類(lèi)型發(fā)布單個(gè)事件?崎溃,返回的結(jié)果與 subscriptionFound  進(jìn)行 [ 位或運(yùn)算 ] (有1則為1),
            subscriptionFound |= postSingleEventForEventType(event, postingState, clazz);
        }
    } else {
          //為事件類(lèi)型發(fā)布單個(gè)事件??
        subscriptionFound = postSingleEventForEventType(event, postingState, eventClass);
    }
    ?//若發(fā)布的事件沒(méi)有被訂閱
    if (!subscriptionFound) {
         //是否打印沒(méi)有訂閱的信息
        if (logNoSubscriberMessages) {
            logger.log(Level.FINE, "No subscribers registered for event " + eventClass);
        }
        /**
           *@重點(diǎn)講解:此處做一次判定
           * 1. 若正常發(fā)布的事件沒(méi)有被訂閱盯质,則在此處將 當(dāng)前 eventBust實(shí)例 
           * 和完成的 event事件封裝成 NoSubscriberEvent類(lèi)型袁串,重新發(fā)送
           *2.若沒(méi)有被訂閱的事件已經(jīng)是封裝了NoSubscriberEvent類(lèi)型的事
           *件,那么將不會(huì)再次發(fā)布了。
           */
        if (sendNoSubscriberEvent && eventClass != NoSubscriberEvent.class &&
                eventClass != SubscriberExceptionEvent.class) {
             // 當(dāng)找不到已發(fā)布事件的訂閱者時(shí)呼巷,EventBus將此事件發(fā)布到事件總線(xiàn)上? 
            post(new NoSubscriberEvent(this, event));
        }
    }
}
    1. 獲取事件類(lèi)型class囱修,判定當(dāng)前事件是不是繼承事件
  • 2.若是繼承事件,則獲取類(lèi)型class的父類(lèi)集合王悍,遍歷父類(lèi)集合破镰, 為事件類(lèi)型發(fā)布單個(gè)事件?,返回的結(jié)果與 subscriptionFound 進(jìn)行 [ 位或運(yùn)算 ]
  • 3.若不是繼承事件压储,則為事件類(lèi)型發(fā)布單個(gè)事件??
    1. 判定發(fā)布的事件是否被訂閱
    1. 沒(méi)有被訂閱鲜漩, 此處做一次判定.
      正常發(fā)布的事件沒(méi)有被訂閱, 在此處將 當(dāng)前 eventBust實(shí)例和完成的 event事件封裝成 NoSubscriberEvent類(lèi)型集惋,重新發(fā)送宇整;
      沒(méi)有被訂閱的事件已經(jīng)是封裝了NoSubscriberEvent類(lèi)型的事件, 將不會(huì)再次發(fā)布了

[ 2 ] 為事件類(lèi)型發(fā)布單個(gè)事件? postSingleEventForEventType(event, postingState, eventClass) 方法

private boolean postSingleEventForEventType(Object event, PostingThreadState postingState, Class<?> eventClass) {
    CopyOnWriteArrayList<Subscription> subscriptions;
    //通過(guò)注冊(cè)類(lèi)獲取訂閱事件集合?
    synchronized (this) {
        subscriptions = subscriptionsByEventType.get(eventClass);
    }
    if (subscriptions != null && !subscriptions.isEmpty()) {
         //遍歷訂閱信息事件集合?
        for (Subscription subscription : subscriptions) {
            postingState.event = event;
            postingState.subscription = subscription;
            boolean aborted = false;
            try {
               //[ 3 ] 發(fā)布訂閱事件?
                postToSubscription(subscription, event, postingState.isMainThread);
                aborted = postingState.canceled;
            } finally {
                postingState.event = null;
                postingState.subscription = null;
                postingState.canceled = false;
            }
            if (aborted) {
                break;
            }
        }
        return true;
    }
    return false;
}
    1. 通過(guò)注冊(cè)類(lèi)classsubscriptionsByEventType獲取訂閱信息集合
      (提示: subscriptionsByEventType集合只有在register注冊(cè)的時(shí)候才會(huì)執(zhí)行put,此處是post發(fā)布事件直接從中取值 ).
  • 2.做判定 subscriptionsByEventType獲取的數(shù)據(jù)為是否為Null
  • 3.若為Null, 表明發(fā)布的事件還沒(méi)有被訂閱芋膘,也就是說(shuō)事件是在執(zhí)行register注冊(cè)之前發(fā)布的鳞青,所以沒(méi)有被訂閱上霸饲,所以直接返回 False即可.
  • 4.若不為Null, 遍歷訂閱信息事件集合?臂拓, 發(fā)布訂閱事件?

重點(diǎn)提示

  • 這里若是發(fā)布的Post事件沒(méi)有被訂閱厚脉,則該事件就會(huì) 流轉(zhuǎn),即作廢.
  • 若發(fā)布的 postSticky事件沒(méi)有被訂閱胶惰,由于postSticky事件是將完整的事件放入內(nèi)存的傻工,當(dāng)執(zhí)行register注冊(cè)時(shí)會(huì)從內(nèi)存中獲取該事件,然后包裝成一個(gè)新的Post事件進(jìn)行發(fā)布孵滞,由于此時(shí)register注冊(cè)已執(zhí)行完畢,所以postSticky事件可以正常使用.

[ 3 ] 發(fā)布訂閱事件? postToSubscription(subscription, event, postingState.isMainThread) 方法

private void postToSubscription(Subscription subscription, Object event, boolean isMainThread) {
    //根據(jù)訂閱事件的 threadMode類(lèi)型 進(jìn)行分發(fā)處理?
    switch (subscription.subscriberMethod.threadMode) {
        case POSTING:  // 默認(rèn)的線(xiàn)程模式中捆,在那個(gè)線(xiàn)程發(fā)送事件就在對(duì)應(yīng)線(xiàn)程處理事件,避免了線(xiàn)程切換坊饶,效率高
             //[ 3.1 ] 執(zhí)行調(diào)用訂閱者?
            invokeSubscriber(subscription, event);
            break;
        case MAIN: // 如在主線(xiàn)程(UI線(xiàn)程)發(fā)送事件泄伪,則直接在主線(xiàn)程處理事件;如果在子線(xiàn)程發(fā)送事件匿级,則先將事件入隊(duì)列蟋滴,然后通過(guò) Handler 切換到主線(xiàn)程,依次處理事件痘绎。
            //判斷是否在主線(xiàn)程發(fā)送分事件
?            if (isMainThread) {  
                invokeSubscriber(subscription, event);
            } else {
                //[3.2]將訂閱事件放入主線(xiàn)程隊(duì)列津函,依此處理事件?
                mainThreadPoster.enqueue(subscription, event);
            }
            break;
        case MAIN_ORDERED:  // 無(wú)論在那個(gè)線(xiàn)程發(fā)送事件,都先將事件入隊(duì)列孤页,然后通過(guò) Handler 切換到主線(xiàn)程尔苦,依次處理事件
            if (mainThreadPoster != null) {
                mainThreadPoster.enqueue(subscription, event);
            } else {
                // 若主線(xiàn)程隊(duì)列為空,則直接調(diào)用執(zhí)行訂閱者
                invokeSubscriber(subscription, event);
            }
            break;
        case BACKGROUND: //如果在主線(xiàn)程發(fā)送事件行施,則先將事件入隊(duì)列蕉堰,然后通過(guò)線(xiàn)程池依次處理事件;如果在子線(xiàn)程發(fā)送事件悲龟,則直接在發(fā)送事件的線(xiàn)程處理事件。
            if (isMainThread) {
                 //[ 3.3 ] 將訂閱事件放入后臺(tái)隊(duì)列冰寻,依次調(diào)用執(zhí)行?
                backgroundPoster.enqueue(subscription, event);
            } else {
                invokeSubscriber(subscription, event);
            }
            break;
        case ASYNC:  //無(wú)論在那個(gè)線(xiàn)程發(fā)送事件须教,都將事件入隊(duì)列,然后通過(guò)線(xiàn)程池處理斩芭。
            //? [ 3.4 ] 將訂閱事件放入線(xiàn)程池隊(duì)列轻腺,依此調(diào)用執(zhí)行訂閱者
            asyncPoster.enqueue(subscription, event);
            break;
        default:
            throw new IllegalStateException("Unknown thread mode: " + subscription.subscriberMethod.threadMode);
    }
}
    1. 根據(jù)訂閱事件的 threadMode類(lèi)型 進(jìn)行分發(fā)處理?
  • 1.1. POSTING: 默認(rèn)的線(xiàn)程模式,在那個(gè)線(xiàn)程發(fā)送事件就在對(duì)應(yīng)線(xiàn)程處理事件划乖,避免了線(xiàn)程切換贬养,效率高
  • 1.2 MAIN: 如在主線(xiàn)程(UI線(xiàn)程)發(fā)送事件,則直接在主線(xiàn)程處理事件琴庵;如果在子線(xiàn)程發(fā)送事件误算,則先將事件入隊(duì)列仰美,然后通過(guò) Handler 切換到主線(xiàn)程,依次處理事件儿礼。
  • 1.3 MAIN_ORDERED: 無(wú)論在那個(gè)線(xiàn)程發(fā)送事件咖杂,都先將事件入隊(duì)列,然后通過(guò) Handler 切換到主線(xiàn)程蚊夫,依次處理事件
  • 1.4 BACKGROUND: 如果在主線(xiàn)程發(fā)送事件诉字,則先將事件入隊(duì)列,然后通過(guò)線(xiàn)程池依次處理事件知纷;如果在子線(xiàn)程發(fā)送事件壤圃,則直接在發(fā)送事件的線(xiàn)程處理事件。
  • 1.5 ASYNC: 無(wú)論在那個(gè)線(xiàn)程發(fā)送事件琅轧,都將事件入隊(duì)列伍绳,然后通過(guò)線(xiàn)程池處理。
    1. 對(duì)事件進(jìn)行分發(fā)后鹰晨,判斷決定將Event事件直接通過(guò)反射執(zhí)行 或 放入相應(yīng)隊(duì)列中逐個(gè)執(zhí)行墨叛。

postSticky粘性事件發(fā)布

通過(guò)對(duì)源碼的分析我們可以發(fā)現(xiàn)postSticky發(fā)布過(guò)程post發(fā)布過(guò)程的區(qū)別,我們看源碼:

public void postSticky(Object event) {
    synchronized (stickyEvents) {
        //[ 1 ] 將訂閱事件類(lèi)型class與事件關(guān)聯(lián)模蜡,放入Map集合緩存?
        stickyEvents.put(event.getClass(), event);?
    }
    //將給定的事件發(fā)布到事件總線(xiàn)
    post(event);
}

可以看出postSticky函數(shù)在執(zhí)行post函數(shù)之前漠趁,執(zhí)行了一次對(duì)完整Event事件Map集合存儲(chǔ),而Map集合的特性決定了在Key值相同的情況下,存儲(chǔ)的Value值最后一次放入的準(zhǔn)忍疾,這也正符合postSticky事件同樣參數(shù)類(lèi)型闯传,以最后一次發(fā)布的事件為準(zhǔn) 特性

Post 、postSticky事件接收

Post事件接收

發(fā)送POST事件一定要確保接收方頁(yè)面執(zhí)行過(guò)了 register注冊(cè),并且已存在對(duì)應(yīng)的接收方法卤妒,即 被訂閱完成后再執(zhí)行事件發(fā)布甥绿,方可被正確接收

postSticky事件接收

postSticky事件在發(fā)布階段進(jìn)行了一次對(duì)完整Event事件的事件的緩存。
若接收方此時(shí)還未執(zhí)行register注冊(cè)则披,則 Event事件則將一直存儲(chǔ)于內(nèi)存中共缕,直至接收方register注冊(cè) 完成后,將會(huì)內(nèi)存中獲取完整Event事件,當(dāng)做一個(gè)新Event事件發(fā)布到總線(xiàn)上士复,進(jìn)而被正確獲取图谷。
我們將register注冊(cè)時(shí)對(duì)postSticky事件特殊特殊處理源碼粘出供大家理解:
若接收方已執(zhí)行完register注冊(cè),則直接進(jìn)行發(fā)布

private void subscribe(Object subscriber, SubscriberMethod subscriberMethod) {
    ...
    ...?
     //?判斷當(dāng)前
    if (subscriberMethod.sticky) {
        //判斷是不是繼承的事件?
        if (eventInheritance) {
            //遍歷粘性事件緩存集合
            Set<Map.Entry<Class<?>, Object>> entries = stickyEvents.entrySet();
            for (Map.Entry<Class<?>, Object> entry : entries) {
                Class<?> candidateEventType = entry.getKey();
                if (eventType.isAssignableFrom(candidateEventType)) {
                    Object stickyEvent = entry.getValue();
                     // @重點(diǎn) 發(fā)布到事件總線(xiàn)
                    checkPostStickyEventToSubscription(newSubscription, stickyEvent);
                }
            }
        } else {
            //根據(jù)訂閱方法類(lèi)型阱洪,從緩存集合獲取對(duì)應(yīng)的 粘性事件?
            Object stickyEvent = stickyEvents.get(eventType);
            // @重點(diǎn) 發(fā)布到事件總線(xiàn)
            checkPostStickyEventToSubscription(newSubscription, stickyEvent);
        }
    }
}

問(wèn)題回答

[ 1 ] Post事件postSticky事件的使用場(chǎng)景
  • Post 適用于向上傳遞便贵,不適用于向下傳遞,即已完成register注冊(cè)操作后冗荸,再發(fā)布POST事件承璃。
  • postSticky 適用于任何場(chǎng)景,即register注冊(cè)操作前后蚌本,都可進(jìn)行postSticky事件發(fā)布
[ 2 ] Post事件postSticky事件的區(qū)別
  • Post事件必須在接收方完成register注冊(cè)操作后發(fā)布才能正常被接收到盔粹,否則無(wú)法被接收隘梨;而postSticky事件則沒(méi)有這樣的限制要求。
  • Post發(fā)布的事件若沒(méi)有被訂閱的事件會(huì)將發(fā)生流轉(zhuǎn)玻佩,即 作廢出嘹,無(wú)效;而postSticky發(fā)布的事件未被訂閱咬崔,則將存儲(chǔ)于內(nèi)存中税稼,當(dāng)訂閱者完成register注冊(cè)后從內(nèi)存中取出,當(dāng)做一個(gè)新事件進(jìn)行發(fā)布垮斯。
[ 3 ] postSticky事件實(shí)現(xiàn) 粘性的原理
  • postSticky的原理是:postSticky在發(fā)布時(shí)將完整的事件存儲(chǔ)于全局Map集合 stickyEvents中郎仆,而當(dāng)接收方進(jìn)行register注冊(cè)是,會(huì)對(duì)粘性事件做特殊處理兜蠕,從stickyEvents Map集合中取出相應(yīng)的事件扰肌,交由postToSubscription函數(shù),進(jìn)行重新發(fā)布.

This ALL! Thanks EveryBody!

請(qǐng)關(guān)注下篇

EventBus系列『番外』——認(rèn)真剖析 『PendingPostQueue』隊(duì)列的實(shí)現(xiàn)思想

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熊杨,一起剝皮案震驚了整個(gè)濱河市曙旭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晶府,老刑警劉巖桂躏,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異川陆,居然都是意外死亡剂习,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)较沪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鳞绕,“玉大人,你說(shuō)我怎么就攤上這事尸曼∶呛危” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵控轿,是天一觀的道長(zhǎng)冤竹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)解幽,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任烘苹,我火速辦了婚禮躲株,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘镣衡。我一直安慰自己霜定,他們只是感情好档悠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著望浩,像睡著了一般辖所。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上磨德,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天缘回,我揣著相機(jī)與錄音,去河邊找鬼典挑。 笑死酥宴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的您觉。 我是一名探鬼主播拙寡,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼琳水!你這毒婦竟也來(lái)了肆糕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤在孝,失蹤者是張志新(化名)和其女友劉穎诚啃,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體浑玛,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绍申,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了顾彰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片极阅。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涨享,靈堂內(nèi)的尸體忽然破棺而出筋搏,到底是詐尸還是另有隱情,我是刑警寧澤厕隧,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布奔脐,位于F島的核電站,受9級(jí)特大地震影響吁讨,放射性物質(zhì)發(fā)生泄漏髓迎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一建丧、第九天 我趴在偏房一處隱蔽的房頂上張望排龄。 院中可真熱鬧,春花似錦翎朱、人聲如沸橄维。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)争舞。三九已至凛忿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間竞川,已是汗流浹背店溢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留流译,地道東北人逞怨。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像福澡,于是被迫代替她去往敵國(guó)和親叠赦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 先吐槽一下博客園的MarkDown編輯器革砸,推出的時(shí)候還很高興博客園支持MarkDown了除秀,試用了下發(fā)現(xiàn)支持不完善就...
    Ten_Minutes閱讀 562評(píng)論 0 2
  • EventBus 是一款在 Android 開(kāi)發(fā)中使用的發(fā)布/訂閱事件總線(xiàn)框架,基于觀察者模式算利,將事件的接收者和發(fā)...
    MonkeyLqj閱讀 10,396評(píng)論 3 31
  • EventBus是在Android中使用到的發(fā)布-訂閱事件總線(xiàn)框架册踩,基于觀察者模式,將事件的發(fā)送者和接收者解耦效拭,簡(jiǎn)...
    BrotherTree閱讀 407評(píng)論 0 1
  • 引言 EventBus是一個(gè)Android事件發(fā)布/訂閱框架暂吉,通過(guò)解耦發(fā)布者和訂閱者簡(jiǎn)化 Android 事件傳遞...
    kakaxicm閱讀 680評(píng)論 3 0
  • 前面在 EventBus設(shè)計(jì)與實(shí)現(xiàn)分析——特性介紹中介紹了EventBus的基本用法,及其提供的大多數(shù)特性的用法缎患;...
    hanpfei閱讀 1,002評(píng)論 4 12