EventBus使用

簡介

EventBus是一個Android事件發(fā)布/訂閱框架鹦马,通過解耦發(fā)布者和訂閱者簡化Android事件傳遞鳄虱,這里的事件可以理解為消息。EventBus 3.0中EventBus提供了EventBusAnnotationProcessor注解處理器來在編譯期通過讀取@Subscribe()注解并解析、處理其中所包含的信息,然后生成java類來保存所有訂閱者關(guān)于訂閱的信息赡茸,這樣就比在EventBus 2.x 采用反射的方式對整個注冊的類的所有方法進行掃描來完成注冊的速度要快

使用

首先添加引用 compile 'org.greenrobot:eventbus:3.0.0'

EventBus的主要元素
  • Event :事件,可以是任意類型的對象祝闻。
  • Publisher:事件發(fā)布者占卧,用于通知Subscriber有事件發(fā)生
  • Subscriber :事件訂閱者,接收特定的事件
  • ThreadMode :定義函數(shù)在何種線程中執(zhí)行联喘,主要包含四個ThreadMode
    1. ThreadMode.POSTING: 事件的處理在和事件的發(fā)送在相同的進程屉栓,所以事件處理時間不應(yīng)太長,不然影響事件的發(fā)送線程耸袜,而這個線程可能是UI線程友多。
  1. ThreadMode.MAIN: 事件的處理會在UI線程中執(zhí)行。事件處理時間不能太長堤框,這個不用說的域滥,長了會ANR的。
  2. ThreadMode.BACKGROUND: 事件的處理會在一個后臺線程中執(zhí)行,但事件處理時間還是不應(yīng)該太長蜈抓,因為如果發(fā)送事件的線程是后臺線程启绰,會直接執(zhí)行事件,如果當前線程是UI線程沟使,事件會被加到一個隊列中委可,由一個線程依次處理這些事件,如果某個事件處理時間太長腊嗡,會阻塞后面的事件的派發(fā)或處理着倾。
  3. ThreadMode.AYSNC: 事件處理會在單獨的線程中執(zhí)行,主要用于在后臺線程中執(zhí)行耗時操作燕少,每個事件會開啟一個線程(有線程池)卡者,但最好限制線程的數(shù)目。
使用的基本步驟
  1. 定義事件類型:
    public class Event {}
  2. 定義事件處理方法:
    public void onEvent
  3. 注冊訂閱者:
    EventBus.getDefault().register(this)
  4. 發(fā)送事件:
    EventBus.getDefault().post(new Event())
  5. 取消注冊:
    EventBus.getDefault().unregister(this)
如下一個使用例子
  • 定義一個事件類型
public class Event {
    private String message;

    public Event(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}
  • 處理事件
public class MainActivity extends AppCompatActivity {

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

        //注冊
        EventBus.getDefault().register(this);

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                Log.e("lwd", "hahha");
                startActivity(intent);
            }
        });
    }

    /**
     * 在這里處理事件
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true, priority = 100)//在ui線程執(zhí)行 優(yōu)先級100
    public void onEvent(Event event) {
        String msg = event.getMessage();
        ((TextView) findViewById(R.id.tv)).setText(msg);
    }

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

優(yōu)先級越高優(yōu)先獲得消息,優(yōu)先級高的訂閱者可以終止事件往下傳遞 EventBus.getDefault().cancelEventDelivery(event) ;其中sticky=true表示黏性事件客们,為了方便理解成訂閱在發(fā)布事件之后崇决,但同樣可以收到事件。發(fā)送粘性事件EventBus.getDefault().postSticky(new Event());如果不再需要該粘性事件我們可以移除EventBus.getDefault().removeStickyEvent(new DataSynEvent());底挫,或者調(diào)用移除所有粘性事件EventBus.getDefault().removeAllStickyEvents();

  • 發(fā)送事件
public class SecondActivity extends AppCompatActivity {

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

        findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        EventBus.getDefault().post(new Event("hahahaha"));
                    }
                }).start();
            }
        });
    }
}
調(diào)用不同的訂閱函數(shù)

首先建立四個類:FirstEvent恒傻、SecondEvent、ThirdEvent 建邓、FourthEvent盈厘。

public class FirstEvent {
    private String message;

    public FirstEvent(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}
public class SecondEvent{
    private String message;

    public SecondEvent(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}
public class ThirdEvent{
    private String message;

    public ThirdEvent(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}
public class FourthEvent{
    private String message;

    public FourthEvent(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

然后在MainActivity中,增加四種模式的訂閱函數(shù)

/**
     * 在這里處理事件
     *
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN, priority = 100)
    public void onEventMain(FirstEvent event) {
        String msg = event.getMessage();
        Log.e("lwd", msg);
    }

    @Subscribe(threadMode = ThreadMode.BACKGROUND, priority = 100)
    public void onEventBackground(SecondEvent event) {
        String msg = event.getMessage();
        Log.e("lwd", msg);
    }

    @Subscribe(threadMode = ThreadMode.POSTING, priority = 100)
    public void onEventPosting(ThirdEvent event) {
        String msg = event.getMessage();
        Log.e("lwd", msg);
    }

    @Subscribe(threadMode = ThreadMode.ASYNC, priority = 100)
    public void onEventAsync(FourthEvent event) {
        String msg = event.getMessage();
        Log.e("lwd", msg);
    }

接下來在SecondActivity中增加四個按鈕涝缝,分別發(fā)送不同類別的事件

findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                EventBus.getDefault().post(new FirstEvent("我是1"));
            }
        }).start();
    }
});
findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                EventBus.getDefault().post(new SecondEvent("我是2"));
            }
        }).start();
    }
});
findViewById(R.id.btn3).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                EventBus.getDefault().post(new ThirdEvent("我是3"));
            }
        }).start();
    }
});
findViewById(R.id.btn4).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                EventBus.getDefault().post(new FourthEvent("我是4"));
            }
        }).start();
    }
});

分別順序點擊SecondActivity的四個按鈕扑庞,打印信息如下:

10-18 11:18:47.723 10159-10159/com.example.luoweidong.eventbu E/lwd: 我是1
10-18 11:18:48.763 10159-10262/com.example.luoweidong.eventbu E/lwd: 我是2
10-18 11:18:49.863 10159-10281/com.example.luoweidong.eventbu E/lwd: 我是3
10-18 11:18:50.403 10159-10294/com.example.luoweidong.eventbu E/lwd: 我是4

由此可見譬重,通過發(fā)布不同的事件類的實例拒逮,EventBus根據(jù)類的實例分別調(diào)用了不同的訂閱函數(shù)來處理事件罐氨。訂閱函數(shù)的執(zhí)行是根據(jù)參數(shù)中的事件類的類名來決定的。

參考鏈接
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滩援,一起剝皮案震驚了整個濱河市栅隐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玩徊,老刑警劉巖租悄,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異恩袱,居然都是意外死亡泣棋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門畔塔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來潭辈,“玉大人,你說我怎么就攤上這事澈吨“迅遥” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵谅辣,是天一觀的道長修赞。 經(jīng)常有香客問我,道長桑阶,這世上最難降的妖魔是什么柏副? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蚣录,結(jié)果婚禮上搓扯,老公的妹妹穿的比我還像新娘。我一直安慰自己包归,他們只是感情好锨推,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著公壤,像睡著了一般换可。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厦幅,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天沾鳄,我揣著相機與錄音,去河邊找鬼确憨。 笑死译荞,一個胖子當著我的面吹牛瓤的,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吞歼,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼圈膏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了篙骡?” 一聲冷哼從身側(cè)響起稽坤,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糯俗,沒想到半個月后尿褪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡得湘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年杖玲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淘正。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡摆马,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出跪帝,到底是詐尸還是另有隱情今膊,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布伞剑,位于F島的核電站斑唬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏黎泣。R本人自食惡果不足惜恕刘,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抒倚。 院中可真熱鬧褐着,春花似錦、人聲如沸托呕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽项郊。三九已至馅扣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間着降,已是汗流浹背差油。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留任洞,地道東北人蓄喇。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓发侵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妆偏。 傳聞我的和親對象是個殘疾皇子刃鳄,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

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

  • 前言:EventBus出來已經(jīng)有一段時間了,github上面也有很多開源項目中使用了EventBus楼眷。所以抽空學習...
    Kerry202閱讀 1,282評論 1 2
  • 本文的EventBus,是指greenrobot的 EventBus, 主要以EventBus3.0 講解; 什么...
    Simon_z閱讀 5,151評論 2 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理铲汪,服務(wù)發(fā)現(xiàn)熊尉,斷路器罐柳,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 一、EventBus介紹 Android optimized event bus that simplifies ...
    獨家記憶丶閱讀 937評論 0 49
  • 1.EventBus是一個基于觀察者模式的事件發(fā)布/訂閱框架狰住,開發(fā)者通過極少的代碼去實現(xiàn)多個模塊之間的通信张吉,而不需...
    newszhu閱讀 414評論 0 0