EventBus3.0入門筆記

前言

網(wǎng)上有很多教程戴已,為什么還需要寫一次埋凯?

因?yàn)榫W(wǎng)上很多基于2.4的,鑒于3.0跟2.4差別還是很大辐董,另外教程有點(diǎn)亂悴品,所以重寫一篇,方便大家(百度沒收錄因?yàn)椴恢С謌ithub pager简烘,所以只方便谷歌的苔严。。孤澎。)也方便自己届氢。

What

EventBus是什么?

EventBus是一個(gè)Android端優(yōu)化的publish/subscribe消息總線覆旭,簡化了應(yīng)用程序內(nèi)各組件間退子、組件與后臺線程間的通信。比如請求網(wǎng)絡(luò)型将,等網(wǎng)絡(luò)返回時(shí)通過Handler或Broadcast通知UI寂祥,兩個(gè)Fragment之間需要通過Listener通信,這些需求都可以通過EventBus實(shí)現(xiàn)茶敏。

另外EventBus其實(shí)是一類框架的總稱壤靶,只不過由于greenrobot做的很優(yōu)秀缚俏,所以大家說起EventBus的時(shí)候一般指的是greenrobot的EventBus,greenrobot應(yīng)該不會陌生吧惊搏,GreenDAO就出自他們之手。

why

為什么要用EventBus忧换?

使用一款第三方庫的原因不外乎因?yàn)榈谌綆旆庋b的好恬惯,使用方便,運(yùn)行效率高亚茬。原本EventBus3.0的效率就比EventBus2.4酪耳、Otto的效率高,配合eventbus-annotation-processor的話更是在原來EventBus3.0的基礎(chǔ)上效率高上一倍刹缝。
另外碗暗,假設(shè)我們的app需要在啟動時(shí)進(jìn)行網(wǎng)絡(luò)請求,可是網(wǎng)絡(luò)有延時(shí)梢夯,頁面加載完成之后再更新UI的話會造成頁面閃動言疗,用戶體驗(yàn)十分不好,所以我們一般會加一個(gè)啟動頁面颂砸,在這時(shí)候進(jìn)行數(shù)據(jù)加載噪奄、網(wǎng)絡(luò)請求等死姚。當(dāng)請求結(jié)束,得到數(shù)據(jù)之后跳轉(zhuǎn)到主頁面了勤篮,我們怎么把數(shù)據(jù)傳遞過去都毒?Sticky Broadcast確實(shí)可以不過重量級了。所以我們需要有一個(gè)輕量級的解決方案碰缔。EventyBus就是這么一個(gè)輕量級的框架账劲!

How

EventBus怎么用

添加依賴

dependencies {
        ......
        compile 'org.greenrobot:eventbus:3.0.0'
        provided 'de.greenrobot:eventbus-annotation-processor:3.0.0-beta1'
    }

當(dāng)然也可以直接在AS里查找,只需要輸入EventBus就可以找到了金抡。


image

注冊

當(dāng)我們想使用EventBus去接收消息或者說訂閱消息之前涤垫,我們必須對其進(jìn)行注冊。通常寫在onCreate里:

   public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EventBus.getDefault().register(this);
        ......
    }

注銷

事物都是兩面的竟终,有注冊就會有注銷蝠猬,注銷寫在onDestroy里:

  public void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
        ......
    }

發(fā)布

假設(shè)我們在網(wǎng)絡(luò)通訊中獲取到了數(shù)據(jù),由于是異步處理统捶,所以不能直接return榆芦,我們需要通過一個(gè)媒介把消息傳遞出去,EventBus開過來了喘鸟。使用非常簡單匆绣,只需要在想要發(fā)布消息的地方加上那么一句話:

EventBus.getDefault().post(new ListItemBus(list));

其中消息一般為我們自己建的bean,如:

public class ListItemBus {
    private List<FoodItem> foodListItems;

    public ListItemBus(List<FoodItem> foodListItems) {
        this.foodListItems = foodListItems;
    }

    public List<FoodItem> getFoodListItems() {
        return foodListItems;
    }

    public void setFoodListItems(List<FoodItem> foodListItems) {
        this.foodListItems = foodListItems;
    }
}

訂閱

訂閱也十分方便什黑,在已注冊的activity或者fragment中崎淳,新建方法如下(方法名可以隨便取):

 @Subscribe(threadMode = ThreadMode.MAIN)
    public void ListEvent(ListItemBus listItemBus) {
       ......
    }

EventBus是根據(jù)消息類來區(qū)分訂閱者的愕把,所以想不同的訂閱者接收不同的消息需要不同的消息類拣凹,如上面的ListItemBus,我們可以把他改成String恨豁,當(dāng)然發(fā)布放那邊傳的也要是String才行嚣镜。

@Subscribe注解

在Subscribe注解中,我們可以定義接收到消息之后的運(yùn)行方式橘蜜,優(yōu)先級等菊匿。

threadMode

定義執(zhí)行線程,提供了4個(gè)方法:

  1. MAIN : 在UI線程中運(yùn)行可以用于修改UI
  2. BACKGROUND :若當(dāng)前線程非UI線程則在當(dāng)前線程中執(zhí)行计福,否則加入后臺任務(wù)隊(duì)列跌捆,使用線程池調(diào)用
  3. ASYNC :加入后臺任務(wù)隊(duì)列,使用線程池調(diào)用象颖,一般用于網(wǎng)絡(luò)請求
  4. POSTING :默認(rèn)模式佩厚,會在發(fā)布的線程執(zhí)行

priority

定義優(yōu)先級,默認(rèn)為0力麸,數(shù)值越大可款,優(yōu)先級越高:

    @Subscribe(threadMode = ThreadMode.MAIN,priority = 1)
    public void ListEvent(ListItemBus listItemBus) {
    ......
    }

sticky

文章開頭的時(shí)候我說過育韩,在啟動頁加載數(shù)據(jù)然后傳遞過去,可是假設(shè)啟動畫面需要持續(xù)3秒闺鲸,而我數(shù)據(jù)1秒加載完了筋讨,這時(shí)候傳遞過去,由于訂閱者還沒有初始化摸恍,所以接收不到消息悉罕,這時(shí)候我們就需要使用到sticky了。使用方法同樣很簡單立镶,只需要在想發(fā)布的地方把post換成postSticky:

EventBus.getDefault().postSticky(new ListItemBus(list));

訂閱者那端也很方便壁袄,在@Subscribe注解中加入sticky = true即可。

  @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
    public void ListEvent(ListItemBus listItemBus) {
       ......
    }

后記

我Boss說過一句話媚媒,我們不單要會用嗜逻,還要知道他為什么這樣用,這時(shí)候缭召,我們就需要涉及源碼了栈顷,我看到一篇挺好的EventBus3.0源碼解析,大家可以看一下EventBus 3.0進(jìn)階:源碼及其設(shè)計(jì)模式 完全解析嵌巷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萄凤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子搪哪,更是在濱河造成了極大的恐慌靡努,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晓折,死亡現(xiàn)場離奇詭異惑朦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)已维,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門行嗤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人垛耳,你說我怎么就攤上這事∑В” “怎么了堂鲜?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長护奈。 經(jīng)常有香客問我缔莲,道長,這世上最難降的妖魔是什么霉旗? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任痴奏,我火速辦了婚禮蛀骇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘读拆。我一直安慰自己擅憔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布檐晕。 她就那樣靜靜地躺著暑诸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辟灰。 梳的紋絲不亂的頭發(fā)上个榕,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音芥喇,去河邊找鬼西采。 笑死,一個(gè)胖子當(dāng)著我的面吹牛继控,可吹牛的內(nèi)容都是我干的苛让。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼湿诊,長吁一口氣:“原來是場噩夢啊……” “哼狱杰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起厅须,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仿畸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后朗和,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體错沽,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年眶拉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了千埃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡忆植,死狀恐怖放可,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情朝刊,我是刑警寧澤耀里,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拾氓,受9級特大地震影響冯挎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咙鞍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一房官、第九天 我趴在偏房一處隱蔽的房頂上張望趾徽。 院中可真熱鬧,春花似錦翰守、人聲如沸孵奶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拒课。三九已至,卻和暖如春事示,著一層夾襖步出監(jiān)牢的瞬間早像,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工肖爵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卢鹦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓劝堪,卻偏偏與公主長得像冀自,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子秒啦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

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

  • 項(xiàng)目到了一定階段會出現(xiàn)一種甜蜜的負(fù)擔(dān):業(yè)務(wù)的不斷發(fā)展與人員的流動性越來越大熬粗,代碼維護(hù)與測試回歸流程越來越繁瑣。這個(gè)...
    fdacc6a1e764閱讀 3,186評論 0 6
  • 原文鏈接:http://blog.csdn.net/u012810020/article/details/7005...
    tinyjoy閱讀 547評論 1 5
  • EventBus 是一個(gè)Android端優(yōu)化的 publish/subscribe 消息總線,簡化了應(yīng)用程序各個(gè)組...
    王世軍Steven閱讀 1,857評論 4 21
  • “Some Interesting Open Source Projects of Android”這個(gè)系列主要是...
    Burjal閱讀 2,588評論 2 10
  • ## 入門 ###簡介 GitHub:EventBus Android optimized event bus t...
    javaBoy_hw閱讀 459評論 0 0