• 简化组件之间的通信
• 事件发送者和接收者解耦
• 可在Activities、Fragments和后台线程中很好的执行
• 避免复杂、容易出错的依赖关系和生命周期问题
• 使你的代码更简单
• 快速
• 体积小(50k左右)
• 超过100000000 +的应用程序中使用
• 具有先进的功能,如DeliveryThreads、优先级等。
• 事件发布者、事件、Eventbus和事件订阅者
publicstatic class MessageEvent { /* Additional fields if needed */ }
a.声明并且使用@Subscribe注解订阅事件
@Subscribe(threadMode= ThreadMode.MAIN)
publicvoid onMessageEvent(MessageEvent event) {/* Do something */};
b.在事件订阅者中注册和注销EventBus,如下:
@Override
publicvoid onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
publicvoid onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
EventBus.getDefault().post(newMessageEvent());
EventBus中可以通过ThreadMode设置调用事件订阅者的线程。方法如下:
ThreadMode: POSTING:无论从那个线程发布的事件,都在该线程中执行。
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessageEvent(MessageEventevent) {/* Do something */};
ThreadMode: MAIN:无论从那个线程发布的事件都会在UI线程中执行。
@Subscribe(threadMode = ThreadMode.MAIN) publicvoid onMessageEvent(MessageEvent event) {/* Do something */};
ThreadMode: BACKGROUND:如果事件是从UI线程中发布出来,则在子线程中执行,如果事件本身是从子线程中出来,则仍然在该子线程中执行。
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessageEvent(MessageEventevent) {/* Do something */};
ThreadMode: ASYNC:无论事件是从那个线程发布,都会另开一个线程执行,所以该方法永远不会在UI线程中被执行。
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessageEvent(MessageEventevent) {/* Do something */};
Subscribe源码如下:
public@interface Subscribe {
ThreadModethreadMode() default ThreadMode.POSTING;
booleansticky() default false;
intpriority() default 0;
}
在同一个线程级别中,订阅者的优先级越高,就越先收到消息,默认优先级是0
EventBus.getDefault().cancelEventDelivery(event) ;
第一步:发送粘性事件
EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
第二步:声明订阅事件
@Subscribe(sticky = true, threadMode= ThreadMode.MAIN)
public void onEvent(MessageEvent event) {
/*Do something */
};
第三步:注册订阅者
EventBus.getDefault().register(this);
在注册过程中粘性用户所有方法将立即得到前面贴粘性的事件
第四步:移除粘性事件两种方式
1.获取粘性事件实例后移除
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
}
2.直接移除
MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
// Now do something with it
}
EventBus.builder().logNoSubscriberMessages(false). sendNoSubscriberEvent(false).installDefaultEventBus();
更多配置见源码EventBusBuilder.java
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe ;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
(java.lang.Throwable);
}
混淆连接
http://greenrobot.org/eventbus/documentation/proguard