EventBus 的簡單使用

本篇文章主要介紹以幾下個知識點:

  • 使用 EventBus 的步驟
  • 一個簡單的demo
圖片來源于網(wǎng)絡(luò)

1. EventBus 簡介

**EventBus ** 是一個基于觀察者模式的 publisher/subscriber 事件總線。通過極少的代碼實現(xiàn)模塊間的通信,使用方便锋爪,性能高狗准,降低耦合黔姜。官方架構(gòu)圖如下:

EventBus-Publish-Subscribe

EventBus 的項目主頁地址:
??https://github.com/greenrobot/EventBus
??EventBus 的官方介紹:
??http://greenrobot.org/eventbus/

2. 使用 EventBus 的步驟

首先在項目中添加 EventBus 依賴:

dependencies {
  compile 'org.greenrobot:eventbus:3.0.0'
}

EventBus 的基本用法很簡單粗悯,有如下幾個步驟:

步驟 1:定義事件(Define events)

定義事件類似定義一個實體類耘柱,如定義兩個事件如下:

/**
 * Function:定義消息事件
 * Author:Wonderful on 2017/3/11 09:26
 */

public class MessageEvent {

    public final String msg;

    public MessageEvent(String msg) {
        this.msg = msg;
    }
}
/**
 * Function:定義其他事件
 * Author:Wonderful on 2017/3/11 09:41
 */

public class SomeOtherEvent {

    public final String something;

    public SomeOtherEvent(String something) {
        this.something = something;
    }
}

步驟 2:準(zhǔn)備訂閱者(Prepare subscribers)

訂閱者實現(xiàn)事件處理方法如捅,這個方法會在事件提交的時候被調(diào)用。需使用@Subscribe注解定義调煎,如下:

   /**
     * This method will be called when a MessageEvent is posted (in the UI thread for Toast)
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event){
        Log.i("onMessageEvent-------->",event.msg);
        ToastUtils.show(event.msg);//彈吐司顯示信息
    }

    /**
     * This method will be called when a SomeOtherEvent is posted
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void handleSomethingElse(SomeOtherEvent event){
        Log.i("handleSomethingElse--->",event.something);
        ToastUtils.show(event.something);
    }

值得注意的是镜遣,注冊監(jiān)聽模塊必須有一個標(biāo)注Subscribe注解方法,否則在register時會拋出異常汛蝙。注解的幾個參數(shù)如下(可以點擊相關(guān)鏈接查看官方介紹):

準(zhǔn)備完訂閱者別忘了添加注冊和注銷訂閱者烈涮,如下:

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

值得注意的是:實際使用中,register窖剑、unregister 通常與 Activity坚洽、Fragment 的生命周期相關(guān),比如當(dāng)你在第一個界面準(zhǔn)備好訂閱者西土,點擊某個控件跳轉(zhuǎn)到第二個界面讶舰,在第二個界面點擊某個控件提交事件并關(guān)閉第二個界面,此時要想在第一個界面的訂閱者接受到事件做出響應(yīng),那么上面在 onStart() 中注冊就可能無效了跳昼,此時應(yīng)該在onCreate() 方法中注冊般甲。我會選擇在 onCreate() 和 onDestroy() 中分別進(jìn)行注冊和注銷:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_bus);

        EventBus.getDefault().register(this);
    }

    @Override
    protected void onDestroy() {
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }

步驟 3:提交事件( Post events)

提交事件很簡單,在代碼中任意位置都可以提交事件鹅颊。如下:

EventBus.getDefault().post(new MessageEvent("Hello everyone"));

3. 一個簡單的Demo

利用 EventBus 實現(xiàn)點擊按鈕提交事件敷存,訂閱者接收到事件后彈出吐司提示事件內(nèi)容,以及在第二個activity 點擊按鈕提交事件并且關(guān)閉后堪伍,在第一個activity中接收到第二個activity提交的事件并作出響應(yīng)锚烦,如下:

eventbus的簡單demo

首先定義事件:

/**
 * Function:定義消息事件
 * Author:Wonderful on 2017/3/11 09:26
 */
public class MessageEvent {

    public final String msg;

    public MessageEvent(String msg) {
        this.msg = msg;
    }
}
/**
 * Function:定義其他事件
 * Author:Wonderful on 2017/3/11 09:41
 */
public class SomeOtherEvent {

    public final String something;

    public SomeOtherEvent(String something) {
        this.something = something;
    }
}

接著準(zhǔn)備訂閱者以及提交事件:

public class EventBusActivity extends AppCompatActivity {

    TextView tv_show;//顯示內(nèi)容

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_bus);

        EventBus.getDefault().register(this);

        findViewById(R.id.post_message_event).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 提交事件
                EventBus.getDefault().post(new MessageEvent("哈,這是EventBusActivity提交的事件"));
            }
        });

        findViewById(R.id.to_other_activity).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 跳轉(zhuǎn)到 SomeOtherActivity
                IntentUtils.to(EventBusActivity.this,SomeOtherActivity.class);
            }
        });

        tv_show = (TextView) findViewById(R.id.tv_show);
    }

    /**
     * This method will be called when a MessageEvent is posted (in the UI thread for Toast)
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event){
        //彈吐司顯示EventBusActivity中提交事件的信息
        ToastUtils.show(event.msg);
    }

    /**
     * This method will be called when a SomeOtherEvent is posted
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void handleSomethingElse(SomeOtherEvent event){
        //設(shè)置接收SomeOtherActivity中提交事件的內(nèi)容
        tv_show.setText(event.something);
    }

    @Override
    protected void onDestroy() {
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }
}
public class SomeOtherActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_some_other);

        findViewById(R.id.post_some_other_event).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EventBus.getDefault().post(new SomeOtherEvent("這是SomeOtherActivity提交的事件紅紅火火"));
                finish();
            }
        });
    }
}

好了,本篇文章就介紹到這帝雇,只是簡單的基本使用涮俄,想要了解更多去看看官方介紹,相信你收獲更大尸闸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末彻亲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吮廉,更是在濱河造成了極大的恐慌苞尝,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茧痕,死亡現(xiàn)場離奇詭異野来,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)踪旷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豁辉,“玉大人令野,你說我怎么就攤上這事』占叮” “怎么了气破?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長餐抢。 經(jīng)常有香客問我现使,道長,這世上最難降的妖魔是什么旷痕? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任碳锈,我火速辦了婚禮,結(jié)果婚禮上欺抗,老公的妹妹穿的比我還像新娘售碳。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布贸人。 她就那樣靜靜地躺著间景,像睡著了一般。 火紅的嫁衣襯著肌膚如雪艺智。 梳的紋絲不亂的頭發(fā)上倘要,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音十拣,去河邊找鬼碗誉。 笑死,一個胖子當(dāng)著我的面吹牛父晶,可吹牛的內(nèi)容都是我干的哮缺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼甲喝,長吁一口氣:“原來是場噩夢啊……” “哼尝苇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起埠胖,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤糠溜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后直撤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體非竿,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年谋竖,在試婚紗的時候發(fā)現(xiàn)自己被綠了红柱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡蓖乘,死狀恐怖锤悄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嘉抒,我是刑警寧澤零聚,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站些侍,受9級特大地震影響隶症,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜岗宣,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一蚂会、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狈定,春花似錦颂龙、人聲如沸习蓬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躲叼。三九已至,卻和暖如春企巢,著一層夾襖步出監(jiān)牢的瞬間枫慷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工浪规, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留或听,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓笋婿,卻偏偏與公主長得像誉裆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缸濒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

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

  • 文/程序員男神 前言 馬上就要年會了足丢、馬上就要放年假了,小伙伴們有沒有很激動庇配?在外漂泊一年終于可以回家看看父母了斩跌。...
    程序猿男神閱讀 665評論 0 3
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,729評論 25 707
  • 前言:EventBus出來已經(jīng)有一段時間了瀑踢,github上面也有很多開源項目中使用了EventBus称勋。所以抽空學(xué)習(xí)...
    Kerry202閱讀 1,282評論 1 2
  • 定義事件類型 使用步驟說明 注冊(一般使用在Activity和Fragment) 銷毀(一般使用在Activity...
    HiSea閱讀 311評論 0 2
  • 一、靈氣 聰明的女人有靈氣顷扩。女人的靈氣,無論如何是裝不出來的,真實的女人才具有靈氣.背離真實自我的女人,無論她多么...
    秋日驕陽閱讀 230評論 0 0