EventBus使用

EventBus事件總線.以觀察者模式實(shí)現(xiàn),消息推送/訂閱.用于Android組件之間相互通信。

(定義:針對(duì)事件提供統(tǒng)一訂閱屏轰,發(fā)布以達(dá)到組件間通信的解決方案署海。 原理:觀察者模式氛琢。發(fā)送者把消息發(fā)送到事件總線,然后事件總線在接收者中查找哪些方法注冊(cè)了這個(gè)事件疤剑,如果某個(gè)方法注冊(cè)了這個(gè)事件滑绒,就觸發(fā)該方法。)隘膘。事件總線框架提供了一種更靈活更強(qiáng)大而又更加完美解耦的解決方案疑故,在很多場合,從開發(fā)效率弯菊,執(zhí)行性能和設(shè)計(jì)思路上都要優(yōu)于BroadcastReceiver纵势。

image

官方工作原理截圖如下:


image

android的應(yīng)用場景,主要應(yīng)用于組件間的通信,activity 钦铁、service软舌、fragment、后臺(tái)線程之間傳遞數(shù)據(jù)牛曹。

怎么使用:

gradle:compile'org.greenrobot:eventbus:3.1.1'

簡單使用步驟:

1,定義事件類

事件類是通信過程中的數(shù)據(jù)的載體,用來傳遞數(shù)據(jù),這里寫一個(gè)最簡單的事件類,后面說如何傳遞數(shù)據(jù)


public class MessageEvent {

}

2.注冊(cè)事件

上面提到數(shù)據(jù)的發(fā)送者和接收者, 注冊(cè)事件是針對(duì)接收者的, 哪個(gè)組件需要接收消息,就在哪個(gè)組件中去注冊(cè)

注冊(cè):

EventBus.getDefault().register(this);

添加函數(shù)注解@Subscribe:當(dāng)數(shù)據(jù)的發(fā)送者發(fā)出消息后,添加這個(gè)注解的函數(shù)會(huì)被調(diào)用

添加@Subscribe注解的函數(shù)參數(shù),寫上接收事件類型,表示這個(gè)組件會(huì)接收這類事件的消息

注銷:

EventBus:EventBus.getDefault().unregister(this);

Note:一個(gè)事件是可以有多個(gè)接收者(訂閱者)

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    EventBus.getDefault().register(this);

}

@Subscribe

public void receiveMessage(MessageEvent messageEvent){

Log.i(TAG,"messageEvent");

}

@Override

protected void onDestroy() {

super.onDestroy();

    EventBus.getDefault().unregister(this);

}

3.發(fā)送事件

發(fā)送事件@Subscribe注解的函數(shù)會(huì)被調(diào)用

EventBus.getDefault().post(newMessageEvent());

githup事例:

@Override

public void onStart() {

super.onStart();EventBus.getDefault().register(this); 

}

@Override

public void onStop() {

super.onStop();EventBus.getDefault().unregister(this);

 }

注意:注冊(cè)和解除注冊(cè)不應(yīng)該寫了這2個(gè)方法里佛点,應(yīng)寫在onCreate onDestroy 函數(shù)中。

上面是EventBus的基本使用流程

android的具體用例:

  • 在事件中傳遞數(shù)據(jù)

  • 指定事件接收線程

  • 發(fā)送黏性事件Sticky Events

  • 接收事件的優(yōu)先級(jí)別

  • 中止事件傳遞

  • 訂閱者索引

** 傳遞數(shù)據(jù):**

使用場景黎比,如果個(gè)人中心更新用戶頭像超营,但是有的時(shí)候app首頁展示用戶頭像,這個(gè)時(shí)候首頁的用戶頭像應(yīng)該刷新阅虫。

1演闭、新定義一個(gè)事件:

public class UpdatePicEvent {

private StringpicUrl;

    public StringgetPicUrl() {

return picUrl;

    }

public void setPicUrl(String picUrl) {

this.picUrl = picUrl;

    }

}

2、發(fā)送事件用新的自定義事件

//點(diǎn)擊上傳圖片颓帝,server端返回url

UpdatePicEvent picEvent =new UpdatePicEvent();

picEvent.setPicUrl("http://xxx.com/20180725.png");

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

3.在接收消息的回調(diào)中用get方法去獲取

@Subscribe

public void receiveMessage(UpdatePicEvent updatePicEvent){

Log.i(TAG,"url:"+updatePicEvent.getPicUrl());

}

指定事件接收的線程

@Subscribe注解,這個(gè)函數(shù)在消息推送之后會(huì)被回調(diào),該注解有幾個(gè)屬性米碰,threadMode能為該函數(shù)指定線程,如果不寫,也會(huì)有個(gè)默認(rèn)值:ThreadMode.POSTING,意思是和發(fā)送事件所在線程一樣

ThreadMode列表

  • ThreadMode.POSTING:和發(fā)送事件在同一個(gè)線程

  • ThreadMode.MAIN:主線程

  • ThreadMode.BACKGROUND:子線程

  • ThreadMode.ASYNC:異步線程

發(fā)送黏性事件Sticky Events

上面事例情況是,發(fā)送者發(fā)送消息购城,訂閱者立馬收到消息见间,他會(huì)把消息推送給所有訂閱者,如果你希望在消息推送完成之后,讓新注冊(cè)的訂閱者也能收到這條消息,這時(shí)候你可以試試Sticky Events工猜,達(dá)到需要配置2點(diǎn)

1.首先,發(fā)送的是黏性事件,代碼將post改為postSticky

UpdatePicEvent picEvent =new UpdatePicEvent();

picEvent.setPicUrl("http://xxx.com/20180725.png");

EventBus.getDefault().postSticky(picEvent);

2.然后,訂閱者要聲明自己能夠接收到黏性事件的消息:代碼中@Subscribe注解中的sticky值為true

@Subscribe(sticky =true)

public void receiveMessage(UpdatePicEvent picEvent){

Log.e("chen","receiveMessage");

}

第二條消息和第一條消息有間隔5s

image

接收事件的優(yōu)先級(jí)別

EventBus可以定義接收事件方的優(yōu)先級(jí)別,在@Subscribe注解中有一個(gè)priority的參數(shù)默認(rèn)值是0,可以自行配置1.2.3.4...數(shù)值越大優(yōu)先級(jí)越高,會(huì)越早收到消息米诉,如果都是默認(rèn)值0 誰先注冊(cè)誰先收到消息

@Subscribe(priority =4)

public void receiveMessage(UpdatePicEvent picEvent){

Log.e("chen","GoodsDetailsActivity:"+picEvent.getPicUrl());

}

中止事件傳遞

類似于有序廣播,優(yōu)先級(jí)高的訂閱者,可以終止事件向下傳遞,EventBus也提供了此功能

@Subscribe(priority =0)

public void receiveMessage(UpdatePicEvent updatePicEvent){

Log.e("chen","MainActivity:"+updatePicEvent.getPicUrl());

    EventBus.getDefault().cancelEventDelivery(updatePicEvent);

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市篷帅,隨后出現(xiàn)的幾起案子史侣,更是在濱河造成了極大的恐慌,老刑警劉巖魏身,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惊橱,死亡現(xiàn)場離奇詭異,居然都是意外死亡箭昵,警方通過查閱死者的電腦和手機(jī)税朴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來家制,“玉大人正林,你說我怎么就攤上這事〔梗” “怎么了觅廓?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涵但。 經(jīng)常有香客問我杈绸,道長帖蔓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任瞳脓,我火速辦了婚禮塑娇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘劫侧。我一直安慰自己埋酬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布板辽。 她就那樣靜靜地躺著奇瘦,像睡著了一般棘催。 火紅的嫁衣襯著肌膚如雪劲弦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天醇坝,我揣著相機(jī)與錄音邑跪,去河邊找鬼。 笑死呼猪,一個(gè)胖子當(dāng)著我的面吹牛画畅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宋距,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼轴踱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谚赎?” 一聲冷哼從身側(cè)響起淫僻,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壶唤,沒想到半個(gè)月后雳灵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闸盔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年悯辙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迎吵。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡躲撰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出击费,到底是詐尸還是另有隱情茴肥,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布荡灾,位于F島的核電站瓤狐,受9級(jí)特大地震影響瞬铸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜础锐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一嗓节、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧皆警,春花似錦拦宣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至意推,卻和暖如春豆瘫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菊值。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工外驱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腻窒。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓昵宇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親儿子。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓦哎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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

  • 前言:EventBus出來已經(jīng)有一段時(shí)間了,github上面也有很多開源項(xiàng)目中使用了EventBus柔逼。所以抽空學(xué)習(xí)...
    Kerry202閱讀 1,289評(píng)論 1 2
  • EventBus這個(gè)開源框架出來已經(jīng)很久了蒋譬,深的很多開發(fā)者青睞,由greenrobot組織貢獻(xiàn)(該組織還貢獻(xiàn)了gr...
    Scus閱讀 2,244評(píng)論 0 0
  • 概述 EventBus是Android和Java的發(fā)布/訂閱事件總線卒落。 簡化了組件之間的通信羡铲;將事件發(fā)送者和接收者...
    有沒有口罩給我一個(gè)閱讀 780評(píng)論 0 0
  • 目錄 1.概述 2.實(shí)戰(zhàn) 1.基本框架搭建 2.新建一個(gè)類FirstEvent 3.在要接收消息的頁面注冊(cè)Even...
    慕涵盛華閱讀 10,508評(píng)論 2 16
  • 概述 EventBus是一個(gè)Android事件發(fā)布/訂閱框架,通過解耦發(fā)布者和訂閱者簡化Android事件傳遞儡毕,這...
    劉滌生閱讀 78,502評(píng)論 6 57