AndroidのEventBus

目錄:
1.1 EventBus的實現原理
1.2 EventBus的基本使用
1.3 EventBus的ThreadMode
1.4 當前常用的事件總線對比

EventBus 原理解析
用LiveEventBus替代RxBus芦劣、EventBus
LiveEventBus的使用
【侵權刪】

1.1 EventBus的實現原理

EventBus是一種基于觀察者模式的發(fā)布/訂閱事件總線框架
EventBus的注冊,通過反射的方式獲取到觀察者的事件、方法辩蛋、所在線程。
以事件類型為key鍵將這些信息存入到Map中拆檬。
事件發(fā)布者將事件通過post方法發(fā)送到EventBus中约素,EventBus將指定的事件分發(fā)給訂閱者。

image.png

EventBus使用Subscribe注解可以指定threadMode,sticky,priority
EventBus.getDefault()是一個單例方法
可以通過配置EventBusBuilder來更改EventBus的屬性

1.2 使用:

注冊: EventBus.getDefault().register(this);
注銷:EventBus.getDefault().unregister(this);
定義事件:普通類贝攒,變量+載入變量的構造函數
發(fā)送事件:構造事件并發(fā)送:EventBus.getDefault().post();
接收事件:添加注解Subscribe盗誊,指定線程,參數是事件

@Subscribe(threadMode = ThreadMode.MAIN)
public void onReceiveEvent(AEventModel aEvent) {
}

其他方法:
判斷是否已經注冊:EventBus.getDefault().isRegistered(this)

完整案例:

// 注冊:
private void initEventBus() {
    if (!EventBus.getDefault().isRegistered(this)) {
            EventBus.getDefault().register(this);
        }
    }
    
// 注銷:
@Override
protected void onStop() {
    super.onStop();
    if (isFinishing()&&EventBus.getDefault()
        .isRegistered(this)) {
            EventBus.getDefault().unregister(this);
        }
    }

// 發(fā)送
AEvent aEvent = new AEvent("1", msgId);
EventBus.getDefault().post(aEvent);   
    
// 接收
@Subscribe(threadMode = ThreadMode.MAIN)
public void onReceiveEvent(AEvent event) {
    ...
}

1.3 EventBus的ThreadMode

線程模式 決定了在當前線程線程發(fā)送事件后是在當前線程接收處理事件隘弊,還是回到主線程處理事件哈踱,亦或是新開一個線程處理事件。
EventBus提供了五種線程模式:

  • ThreadMode.POSTING长捧,posting
    默認的線程模式嚣鄙,在哪個線程發(fā)送事件就在對應線程處理事件,避免了線程切換串结,效率高。
  • ThreadMode.MAINmain
    如在主線程(UI線程)發(fā)送事件肌割,則直接在主線程處理事件卧蜓;如果在子線程發(fā)送事件,則先將事件列入隊列把敞,然后通過 Handler 切換到主線程弥奸,依次處理事件。
  • ThreadMode.MAIN_ORDERED奋早,main_ordered
    無論在哪個線程發(fā)送事件盛霎,都先將事件列入隊列,然后通過 Handler 切換到主線程耽装,依次處理事件愤炸。
  • ThreadMode.BACKGROUNDbackground
    如果在主線程發(fā)送事件掉奄,則先將事件列入隊列规个,然后通過線程池依次處理事件;如果在子線程發(fā)送事件姓建,則直接在發(fā)送事件的線程處理事件诞仓。
  • ThreadMode.ASYNCasync
    無論在哪個線程發(fā)送事件速兔,都將事件列入隊列墅拭,然后通過線程池處理。

1.4 當前常用的事件總線對比

image.png

為什么要用LiveEventBus

  • 能感知生命周期
    1 消息隨時訂閱涣狗,自動取消訂閱
    2 告別內存泄漏
    3 告別生命周期造成的崩潰

  • 支持跨進程帜矾、跨APP消息發(fā)送
    1 進程內通信
    2 APP內跨進程通信
    3 APP間通信

  • 還有其他更多特性
    1 免配置直接使用,方便快捷
    2 支持粘性消息Sticky
    3 支持AndroidX
    4 支持延遲發(fā)送
    5 觀察者支持多種接收模式(全生命周期/激活狀態(tài)可接受消息)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末屑柔,一起剝皮案震驚了整個濱河市屡萤,隨后出現的幾起案子,更是在濱河造成了極大的恐慌掸宛,老刑警劉巖死陆,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異唧瘾,居然都是意外死亡措译,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門饰序,熙熙樓的掌柜王于貴愁眉苦臉地迎上來领虹,“玉大人求豫,你說我怎么就攤上這事塌衰∷呱裕” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵最疆,是天一觀的道長杯巨。 經常有香客問我,道長努酸,這世上最難降的妖魔是什么服爷? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮获诈,結果婚禮上仍源,老公的妹妹穿的比我還像新娘。我一直安慰自己舔涎,他們只是感情好笼踩,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著终抽,像睡著了一般戳表。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昼伴,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天匾旭,我揣著相機與錄音,去河邊找鬼圃郊。 笑死价涝,一個胖子當著我的面吹牛,可吹牛的內容都是我干的持舆。 我是一名探鬼主播色瘩,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逸寓!你這毒婦竟也來了居兆?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤竹伸,失蹤者是張志新(化名)和其女友劉穎泥栖,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體勋篓,經...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡吧享,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了譬嚣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钢颂。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拜银,靈堂內的尸體忽然破棺而出殊鞭,到底是詐尸還是另有隱情遭垛,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布钱豁,位于F島的核電站耻卡,受9級特大地震影響疯汁,放射性物質發(fā)生泄漏牲尺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一幌蚊、第九天 我趴在偏房一處隱蔽的房頂上張望谤碳。 院中可真熱鬧,春花似錦溢豆、人聲如沸蜒简。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搓茬。三九已至,卻和暖如春队他,著一層夾襖步出監(jiān)牢的瞬間卷仑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工麸折, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锡凝,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓垢啼,卻偏偏與公主長得像窜锯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芭析,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容