EventBus
参考
github EventBus配置
compile 'org.greenrobot:eventbus:3.0.0'
//ProGuard
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
使用
//Step 1: Define events (OPJO)
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
//Step 2: Prepare subscribers @Subscribe
// This method will be called when a MessageEvent is posted (in the UI thread for Toast)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
// This method will be called when a SomeOtherEvent is posted
@Subscribe
public void handleSomethingElse(SomeOtherEvent event) {
doSomethingWith(event);
}
//Step 3: register subscribers
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
//Step 4: Post events
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
ThreadMode
- PostThread 默认
发布事件和接收事件在同一个线程
- MainThread
- BackgroundThread
如果事件在UI线程中发布出来,那么该事件处理函数就会在新的线程中运行。
如果事件在子线程中发布出来,那么该事件处理函数直接在发布事件的线程中执行 - Async
无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行
黏性事件:在发送某种类型黏性事件之后再订阅该事件也能收到该事件的最近一条
//EventBus keeps the last sticky event of a certain type in memory.
//eventbus在内存中保存某种类型黏性事件的最后一个。
//黏性事件处理函数:
@Subscribe(sticky = true)
public void XXX(MessageEvent messageEvent) {
......
}
//发送黏性事件:
EventBus.getDefault().postSticky(new MessageEvent("test"));
//Getting and Removing sticky Events manually
//获取,删除某种类型的黏性事件
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
// "Consume" the sticky event
EventBus.getDefault().removeStickyEvent(stickyEvent);
// Now do something with it
}
MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
// Now do something with it
}
使用EventBuilder配置EventBus
boolean logSubscriberExceptions = true;
boolean logNoSubscriberMessages = true;
boolean sendSubscriberExceptionEvent = true;
boolean sendNoSubscriberEvent = true;
boolean throwSubscriberException;
boolean eventInheritance = true;
boolean ignoreGeneratedIndex;
boolean strictMethodVerification;
//配置默认的EventBus -->EventBus.getDefault();
//在EventBus实例化之前,最好是在Application中去调用
EventBus.builder()
.throwSubscriberException(BuildConfig.DEBUG)
.installDefaultEventBus();
//builder模式配置单个实例
EventBus eventBus = EventBus.builder()
.logNoSubscriberMessages(false)
.throwSubscriberException(true)
.sendNoSubscriberEvent(false)
.build();