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

黏性事件:在发送某种类型黏性事件之后再订阅该事件也能收到该事件的最近一条


//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();

Subscriber Index