[EventBus源碼解析] 初探EventBus

  本期blog做爲EventBus(如下簡稱EB)學習的始動篇,主要記載了EB的功能、優勢、使用方法,內容基於github上的README.mdHOWTO.mdjava

何爲EventBus

  EB實現了Android上的一種事件分發/接收總線機制,其優勢能夠歸納爲如下三條:git

  1. 簡潔:將事件分發者與接收者解耦,代碼簡單清晰;
  2. 快速:使用了反射,而不是在Android上效率低下的註解方式進行實現
  3. 輕量級:jar <50k

EventBus的使用方法

  將EventBus引入到項目中(gradle)  github

compile 'de.greenrobot:eventbus:2.4.0'

 

  分發事件緩存

eventBus.post(anyEvent);

  接收事件網絡

eventBus.register(this);
public void onEvent(AnyEvent e) {/* do something */};

 

  以上就是很是簡單的EventBus使用方法,下面是部分進階內容:)異步

EB中不一樣的線程模式/ThreadMode

  在實際開發中,每每須要根據需求的不一樣(是UI變化仍是網絡請求等),在不一樣的線程中進行邏輯處理。EB經過在接收者中使用不一樣的方法命名,爲咱們提供了簡便的處理方法,無須深刻到複雜的線程內部。ide

  • PostThread: 默認的調用方式,在同一線程中啓動。如無特別需求,皆應採起此方式。
  • MainThread: 在主線程(UI線程)中啓動,應避免長時間操做阻塞主線程(ANR)。
  • BackgroundThread: EB使用固有的後臺線程進行處理,也應當避免長時間操做形成阻塞。
  • Async: 異步處理,在主線程與後臺線程以外啓動新的線程,長時間操做應當用此模式。EB內建了線程池用於複用。

  在接收者中以方法名onEventXXX來使用不一樣的線程模式。post

定製Custom EB

  一般簡便的獲取EventBus實例是經過 EventBus.getDefault() 來獲取單例,當須要對其進行定製時,能夠經過EventBusBuilder進行。學習

EventBus eventBus = EventBus.builder().logNoSubscriberMessages(false).sendNoSubscriberEvent(false).build(); // 當沒有對應接收者時,不發送消息

 

  更多的用法能夠參閱javadocgradle

定製Default EB

  若是想對默認的EB單例進行定製,須要在初次調用EventBus.getDefault()以前進行,一般建議放在Application類中。

EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).installDefaultEventBus();

 

終止Event分發

  在onEvent中經過eventBus.cancelEventDelivery(event)能夠終止該Event的繼續分發

接收者優先級

  具備更大優先級的接收者,會優先處理信息,能夠搭配上一條(終止Event分發)使用。

int priority = 1;
EventBus.getDefault().register(this, priority);

 

Sticky Events

  不知道怎樣恰當翻譯(粘性事件?)。EB內建了一個微型的緩存機制,能夠保存最近一次以Sticky形式發送的Event,當接收者(鬚生命爲Sticky)註冊的時間晚於最近一個StickyEvent時,仍然能夠接收到該Event。

  發送StickyEvent

EventBus.getDefault().postSticky(someEvent);

 

  接收StickyEvent

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

public void onEvent(SomeEvent e) {
    /* do something */
}

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

  獲取上一個StickyEvent

EventBus.getDefault().getStickyEvent(Class<?> eomeEventType);

ProGuard配置

  由於ProGuard會對方法名進行混淆,而EB是基於反射完成的,故須要在ProGuard文件(proguard.cfg)中配置特殊規則

-keepclassmembers class ** {
    public void onEvent*(**);
}

# Only required if you use AsyncExecutor
-keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}

 

AsyncExcutor

  非核心功能,暫且略過不表。

相關文章
相關標籤/搜索