EventBus——觀察者模式的典型應(yīng)用

EventBus (發(fā)布者和訂閱者)

前言
小項(xiàng)目頁(yè)面間、線(xiàn)程間、模塊間,通信一般使用:公共變量、Intent、Handler、Broadcast,接口等等。。
當(dāng)項(xiàng)目越來(lái)越復(fù)雜時(shí),使用這些通信方式之后,代碼量大,邏輯錯(cuò)終復(fù)雜,高度耦合。為了解決這個(gè)大問(wèn)題,然后就誕生了這個(gè)框架。

官網(wǎng)示例調(diào)用代碼:

EventBus in 3 steps

  1. Define events:

    public static class MessageEvent { /* Additional fields if needed */ }
    
  2. Prepare subscribers: Declare and annotate your subscribing method, optionally specify a thread mode:

    @Subscribe(threadMode = ThreadMode.MAIN)  
    public void onMessageEvent(MessageEvent event) {/* Do something */};
    

    Register and unregister your subscriber. For example on Android, activities and fragments should usually register according to their life cycle:

     @Override
     public void onStart() {
         super.onStart();
         EventBus.getDefault().register(this);
     }
    
     @Override
     public void onStop() {
         super.onStop();
         EventBus.getDefault().unregister(this);
     }
    
  3. Post events:

     EventBus.getDefault().post(new MessageEvent());
    

自定義Event事件
訂閱者接收消息注冊(cè):EventBus.getDefault().register()(一般在onCreate中注冊(cè))
訂閱者取消訂閱注冊(cè):EventBus.getDefault().unregister();(一般在onDestory中解除注冊(cè))
發(fā)布者發(fā)送消息:EventBus.getDefault().post(event)
訂閱者接收消息:1、注解 2、主線(xiàn)程 3、event中取消息
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent evnt){}

圖解:


image.png

擴(kuò)展:
onEvent:發(fā)送者在哪個(gè)線(xiàn)程發(fā)送的,該方法也在哪個(gè)線(xiàn)程中處理事件
onEventMainThread:不管發(fā)送者在哪個(gè)線(xiàn)程發(fā)送的,該方法都會(huì)在主線(xiàn)程中處理事件
onEventBackgroundThread:如果發(fā)送者是在子線(xiàn)程發(fā)送的,那么該方法也在同一個(gè)子線(xiàn)程處理事件,如果發(fā)送者是在主線(xiàn)程,那么該方法在一個(gè)線(xiàn)程池中處理事件
onEventAsync:不管發(fā)送者在哪個(gè)線(xiàn)程發(fā)送的,該方法都在線(xiàn)程池中執(zhí)行

原理:
先從注冊(cè)開(kāi)始看,
1、EventBus.getDefault().register(this);將Activity.this傳遞進(jìn)EventBus當(dāng)中,里面通過(guò)反射,獲取到包含@Subscribe 注解的函數(shù),
2、篩選onEvent開(kāi)頭的方法,獲取方法的權(quán)限修飾符,必須是public,然后獲取函數(shù)所需參數(shù)數(shù)組,
3、通過(guò)把方法名,方法形參,線(xiàn)程模型封裝成一個(gè)SubscriberMethod添加進(jìn)集合里,
3、然后遍歷集合中當(dāng)前訂閱者的所有訂閱方法,通過(guò)訂閱方法參數(shù)的字節(jié)碼,創(chuàng)建訂閱者,優(yōu)先級(jí)處理,事件類(lèi)型處理

再看Post:
1、獲取當(dāng)前線(xiàn)程的隊(duì)列,將event添加到隊(duì)列里;
2、通過(guò)event拿到事件的字節(jié)碼,注意event是支持繼承的,會(huì)獲取到事件的父類(lèi)和接口的字節(jié)碼到集合中;
3、然后通過(guò)該事件字節(jié)碼獲取所有的訂閱者。
4、根據(jù)不同的線(xiàn)程模型調(diào)用不同的方法:
通過(guò)反射調(diào)用訂閱者訂閱方法
handler發(fā)送消息
在線(xiàn)程池發(fā)送消息(包含異步或者后臺(tái)兩種)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容