本期blog做为EventBus(如下简称EB)学习的始动篇,主要记载了EB的功能、优势、使用方法,内容基于github上的README.md与HOWTO.md。java
EB实现了Android上的一种事件分发/接收总线机制,其优势能够归纳为如下三条:git
将EventBus引入到项目中(gradle) github
compile 'de.greenrobot:eventbus:2.4.0'
分发事件缓存
eventBus.post(anyEvent);
接收事件网络
eventBus.register(this); public void onEvent(AnyEvent e) {/* do something */};
以上就是很是简单的EventBus使用方法,下面是部分进阶内容:)异步
在实际开发中,每每须要根据需求的不一样(是UI变化仍是网络请求等),在不一样的线程中进行逻辑处理。EB经过在接收者中使用不一样的方法命名,为咱们提供了简便的处理方法,无须深刻到复杂的线程内部。ide
在接收者中以方法名onEventXXX来使用不一样的线程模式。post
一般简便的获取EventBus实例是经过 EventBus.getDefault() 来获取单例,当须要对其进行定制时,能够经过EventBusBuilder进行。学习
EventBus eventBus = EventBus.builder().logNoSubscriberMessages(false).sendNoSubscriberEvent(false).build(); // 当没有对应接收者时,不发送消息
更多的用法能够参阅javadocgradle
若是想对默认的EB单例进行定制,须要在初次调用EventBus.getDefault()以前进行,一般建议放在Application类中。
EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).installDefaultEventBus();
在onEvent中经过eventBus.cancelEventDelivery(event)能够终止该Event的继续分发
具备更大优先级的接收者,会优先处理信息,能够搭配上一条(终止Event分发)使用。
int priority = 1; EventBus.getDefault().register(this, priority);
不知道怎样恰当翻译(粘性事件?)。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会对方法名进行混淆,而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); }
非核心功能,暂且略过不表。