從EventBus2.0 到 EventBus3.0

40dcb91772af2cfb64dd9b2c4d0778f8.jpg

前言:

以前開(kāi)發(fā)一直在用 EventBus2.0,最近想學(xué)點(diǎn)新東西,看到EventBus竟然出3.0了,看時(shí)間是早就有了,但一直沒(méi)接觸過(guò),就學(xué)習(xí)學(xué)習(xí),也順便談?wù)勎以谑褂脙蓚€(gè)版本時(shí),對(duì)它們的不同的感受。
開(kāi)講之前先付一下源碼地址:https://github.com/greenrobot/EventBus

介紹一下:

EventBus是由大名鼎鼎的greenrobot出品的一個(gè)用于Android中事件發(fā)布/訂閱的庫(kù)。簡(jiǎn)單點(diǎn)說(shuō)就是用于Fragment,Activity,Service,線程之間進(jìn)行數(shù)據(jù)傳遞,它為開(kāi)發(fā)者提供除了 intent、handler、boardcast這幾種傳遞數(shù)據(jù)的方式之外的一種選擇,其優(yōu)點(diǎn)在于 幾乎不怎么消化資源,并且代碼優(yōu)雅簡(jiǎn)潔。

EventBus 的組成

EventBus-Publish-Subscribe.png

從上圖我們可以看到,EventBus 作為事件總線,有3個(gè)重要做成部分:

  • Publisher: 發(fā)布者。 表示數(shù)據(jù)的持有者,通過(guò)eventbus.post(obj)方法將數(shù)據(jù)傳遞出去,然而并不關(guān)心數(shù)據(jù)是否被接受,以及數(shù)據(jù)的傳遞過(guò)程。獲取方法也很簡(jiǎn)單:
EventBus.getDefault();
  • Event:事件。這里我習(xí)慣稱之為數(shù)據(jù),就是你所要傳遞出得對(duì)象。
  • Subscriber: 訂閱者。 或者好理解點(diǎn)的話,可是稱之為接收者,數(shù)據(jù)將通過(guò)這些函數(shù)來(lái)進(jìn)行接受。EventBus這里提供了四個(gè)函數(shù)且只能用這四個(gè):onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync .當(dāng)然,上面的方法是對(duì)于EventBus2.0中用到的 下面會(huì)重點(diǎn)講一下3.0的用法。

EventBus 四個(gè)Subscriber

首先在將四種方式之前不得不說(shuō)一下ThreadMode, ThreadMode 是EventBus中一個(gè)很重要的概念,其本身是一個(gè)enum,他同樣提供了四個(gè)默認(rèn)屬性值:Async,BackgroundThread,MainThread,PostThread;而在3.0中則改為
ASYNC,BACKGROUND,MAIN,POSTING。分別對(duì)應(yīng)四個(gè)方法。

先來(lái)說(shuō)一下2.0中的Subscriber

onEvent
對(duì)應(yīng) PostThread,當(dāng)使用onEvent作為訂閱函數(shù)時(shí),發(fā)布者在哪個(gè)線程發(fā)布事件,onEvent就會(huì)在哪個(gè)線程接收事件。因?yàn)楹瘮?shù)執(zhí)行的線程不確定,這就要求用戶 最好不要執(zhí)行耗時(shí)操作,可能會(huì)出現(xiàn)線程阻塞或者事件分發(fā)不及時(shí)的問(wèn)題。
注意一點(diǎn):**方法的修飾符 最好 使用 public **

public void onEvent(Object obj){
  
}

** onEventMainThread**
對(duì)應(yīng) MainThread,當(dāng)使用onEventMainThread作為訂閱函數(shù)時(shí),發(fā)布者不管在哪個(gè)線程發(fā)布事件,onEventMainThread都會(huì)在主線程接收事件。這就要求用戶 一定不要執(zhí)行耗時(shí)操作,不然會(huì)造成線程阻塞。

public void onEventMainThread(Object obj){
  
}

** onEventBackground**
對(duì)應(yīng) BackgroundThread,當(dāng)使用onEventBackground作為訂閱函數(shù)時(shí),發(fā)布者如果在主線程發(fā)布事件,onEventBackground將會(huì)新開(kāi)一個(gè)子線程并接收事件,但是如果是在子線程中發(fā)布事件,onEventBackground將會(huì)直接在該子線程中接受事件。

public void onEventBackground(Object obj){
  
}

** onEventAsync**
對(duì)應(yīng) Async,當(dāng)使用onEventAsync作為訂閱函數(shù)時(shí),發(fā)布者無(wú)論在哪個(gè)線程發(fā)布事件,onEventAsync都會(huì)新開(kāi)一個(gè)子線程并接收事件。

public void onEventAsync(Object obj){
  
}

而相對(duì)來(lái)說(shuō),3.0 改變對(duì)需要固定函數(shù)名的設(shè)定,提供了一種新的形式,改用注解@Subscribe ,在使用中更加靈活,而且 這里 ThreadMode 將被直接使用。

onEvent 函數(shù)的實(shí)現(xiàn)

//發(fā)布線程中,調(diào)用
@Subscribe(threadMode = ThreadMode.POSTING)
public void eventbusPosting(Object object){
}

onEventMainThread 函數(shù)的實(shí)現(xiàn)

//主線程中,調(diào)用
@Subscribe(threadMode = ThreadMode.MAIN)
public void eventbusMain(Object object){
}

onEventBackground 函數(shù)的實(shí)現(xiàn)

//發(fā)布線程為主線程,新開(kāi)子線程,調(diào)用
//發(fā)布線程為子線程,該線程調(diào)用
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void eventbusBackground(Object object){
}

onEventAsync 函數(shù)的實(shí)現(xiàn)

//新開(kāi)子線程調(diào)用
@Subscribe(threadMode = ThreadMode.ASYNC)
public void eventbusAsync(Object object){
}

最后說(shuō)一點(diǎn):EventBus 并沒(méi)有摒棄固定函數(shù)名的形式,開(kāi)發(fā)者仍舊可以使用這種形式,不過(guò)在使用過(guò)程中必須要 添加注解 @ Subscribe 但不用指定ThreadMode

EventBus的基本使用

引入

compile 'org.greenrobot:eventbus:3.0.0'

定義事件

public class MessageEvent { /* Additional fields if needed */ }

注冊(cè)訂閱者

EventBus.getDefault().register(this);

發(fā)送事件

EventBus.getDefault().post(messageEvent);

接收事件

//eventbus2.0形式
public void onEvent(MessageEvent event){

}
或者
//eventbus3.0形式
@Subscribe(threadMode = ThreadMode.POSTING)
public void postingME(MessageEvent event){

}

注銷訂閱

EventBus.getDefault().unregister(this);
最后編輯于
?著作權(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)容

  • 先吐槽一下博客園的MarkDown編輯器,推出的時(shí)候還很高興博客園支持MarkDown了,試用了下發(fā)現(xiàn)支持不完善就...
    Ten_Minutes閱讀 667評(píng)論 0 2
  • 前言:EventBus出來(lái)已經(jīng)有一段時(shí)間了,github上面也有很多開(kāi)源項(xiàng)目中使用了EventBus。所以抽空學(xué)習(xí)...
    Kerry202閱讀 1,374評(píng)論 1 2
  • 對(duì)于Android開(kāi)發(fā)老司機(jī)來(lái)說(shuō)肯定不會(huì)陌生,它是一個(gè)基于觀察者模式的事件發(fā)布/訂閱框架,開(kāi)發(fā)者可以通過(guò)極少的代碼...
    飛揚(yáng)小米閱讀 1,547評(píng)論 0 50
  • 我每周會(huì)寫一篇源代碼分析的文章,以后也可能會(huì)有其他主題.如果你喜歡我寫的文章的話,歡迎關(guān)注我的新浪微博@達(dá)達(dá)達(dá)達(dá)s...
    SkyKai閱讀 25,178評(píng)論 23 184
  • 5月22日,多云,有陣雨。 今天最大的損失就是不慎將手機(jī)丟失,手機(jī)本身值不了多少錢,但里邊的數(shù)據(jù)內(nèi)容對(duì)我太重要了,...
    易水微塵閱讀 384評(píng)論 1 0

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