#Android# 學(xué)EventBus,你可以參考下我的筆記

知識框架(腦圖)

EventBus腦圖

出現(xiàn)背景

  • 多線程環(huán)境下容易產(chǎn)生回調(diào)地獄和異常
  • Android中內(nèi)置的組件間通信方式繁多(handler、intent、broadcast等等)

解決思路

EventBus的設(shè)計思路

使用事件總線(EventBus)的publisher/subscriber模式進(jìn)行解耦,解決組件間通信和多線程問題

具體步驟

(1)添加依賴庫

 compile 'org.greenrobot:eventbus:3.0.0'

(2)定義事件

事件只是一個POJO(plain old java object,Java原始類型),沒有特定的要求。

public class MessageEvent {
    public final String message;

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

(3)準(zhǔn)備訂閱者

使用注解的方式,指定方法運(yùn)行的線程 ,參數(shù)決定接收的事件,方法名任意,建議由on+事件名組成。

ThreadMode

  • ThreadMode.POSTING:跟發(fā)布事件的線程一致
  • ThreadMode.MAIN:在主線程中運(yùn)行
  • ThreadMode.BACKGROUND:在后臺線程中運(yùn)行(非主線程則直接運(yùn)行,否則新開一個線程運(yùn)行)
  • ThreadMode.ASYNC:在異步線程中運(yùn)行(不管post線程,我就是要新開一個線程運(yùn)行)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
    Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}

接著,在適當(dāng)?shù)臅r候注冊事件,并在適當(dāng)?shù)臅r候解注冊事件

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

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

(4)發(fā)送事件

可以在任何地方發(fā)送事件,然后注冊了事件的地方就會收到啦~

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

Q&A

問題1:EventBus這么簡潔,有什么缺點(diǎn)嗎?

跟RxJava相比,就是缺乏對事件的處理和再分發(fā)。它直接new一個事件,然后發(fā)布,你無法對事件進(jìn)行處理。

問題2:已經(jīng)消費(fèi)的事件還有可能重發(fā)嗎?

開啟stickyEvent。

發(fā)布事件的時候使用postSticky

EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));

而處理事件時,配置sticky = true。這樣重啟Activity的時候,先前的事件會重分發(fā),省去了使用SharePreferences/Bundle保存狀態(tài)的步驟~

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

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEvent(MessageEvent event) {
    // UI updates must run on MainThread
    textField.setText(event.message);
}

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

當(dāng)然,當(dāng)再也不需要這個sticky Event時需要手動移除。

//移除sticky屬性,然后將事件返回
MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
    // Now do something with it
}

問題3:可以設(shè)置訂閱者的優(yōu)先級嗎?

可以的,使用注解參數(shù)priority輕松搞定

@Subscribe(priority = 1); //默認(rèn)的是0
public void onEvent(MessageEvent event) {
…
}

問題4:可以停止事件繼續(xù)往下分發(fā)嗎?

可以的,使用cancelEventDelivery方法。高優(yōu)先級的訂閱者的特權(quán)?。?/p>

// Called in the same thread (default)
@Subscribe
public void onEvent(MessageEvent event){
// Process the event
…

EventBus.getDefault().cancelEventDelivery(event) ;
}

參考文檔

  1. EventBus Documentation:http://greenrobot.org/eventbus/documentation/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • EventBus 是一個Android端優(yōu)化的 publish/subscribe 消息總線,簡化了應(yīng)用程序各個組...
    王世軍Steven閱讀 1,960評論 4 21
  • EventBus源碼分析(一) EventBus官方介紹為一個為Android系統(tǒng)優(yōu)化的事件訂閱總線,它不僅可以很...
    蕉下孤客閱讀 4,102評論 4 42
  • 對于Android開發(fā)老司機(jī)來說肯定不會陌生,它是一個基于觀察者模式的事件發(fā)布/訂閱框架,開發(fā)者可以通過極少的代碼...
    飛揚(yáng)小米閱讀 1,545評論 0 50
  • 中午一個人吃家外賣,看電影《剩者為王》,女主角說,"我以前一直覺得愛情這種東西,本來就應(yīng)該是要在那里的啊,該來的就...
    小二的原創(chuàng)生活閱讀 798評論 0 0
  • 有一晚我夢回了大唐 然后一直在城墻外流亡 哦,哦,哦~ 來回廝殺的畫面長長 在我掉進(jìn)護(hù)城河后瞬間消茫 啊,啊,啊~...
    那片雛菊閱讀 215評論 0 0

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