Events are POJO (plain old Java object) without any specific requirements.
事件就是一个包含特定要求的原始Java对象
publicclassMessageEvent { publicfinal String message; publicMessageEvent(String message) { this.message = message; } }
订阅者实现事件处理方法onEvent,当一个事件被接收时会调用这个方法。 这些订阅者需要在总线中注册和解注册他们自己。
@Override publicvoid onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override publicvoid onStop() { EventBus.getDefault().unregister(this); super.onStop(); } // This method will be called when a MessageEvent is posted 当一个MessageEvent被传递的时候,这个方法会被调用publicvoid onEvent(MessageEvent event){ Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show(); } // This method will be called when a SomeOtherEvent is posted 当一个SomeOtherEvent被传递的时候,这个方法会被调用publicvoid onEvent(SomeOtherEvent event){ doSomethingWith(event); }
从你代码的任意地方发布这个事件, 所有匹配这个事件的订阅者会接收到它。
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
EventBus可以帮助你处理线程问题: 事件可以在与提交线程不同的线程中被提交。
一个常用的场景是处理UI改变。在Android中,UI 改变必须在UI线程中进行。另外,网络请求以及其他的耗时任务都不应该在主线程中操作。 EventBus可以帮助你处理这些事情,并与主线程同步(而不必使用AsynTask深入处理线程过渡等)。
在EventBus中,你可以使用ThreadMode定义线程,这个线程可以调用事件处理方法onEvent。
// Called in the same thread (default)
public void onEvent(MessageEvent event) { log(event.message); }
// Called in Android UI's main thread
public void onEventMainThread(MessageEvent event) { textField.setText(event.message); }
// Called in the background thread
public void onEventBackgroundThread(MessageEvent event){ saveToDisk(event.message); }
// Called in a separate thread
public void onEventAsync(MessageEvent event){ backend.send(event.message); }
可以在注册订阅者的时候,提供一个优先级改变事件传递的顺序。
int priority =1; EventBus.getDefault().register(this, priority);
在同一个传递线程中(ThreadMode),优先级高的订阅者会在优先级低的订阅者之前收到事件,默认优先级为0.
注意:优先级不会影响具有不同ThreadModes的订阅者之间的传递顺序
EventBus eventBus = EventBus.builder().logNoSubscriberMessages(false).sendNoSubscriberEvent(false).build();
另一个是当订阅者执行失败时抛出异常的例子。注意: EventBus捕获到从onEvent方法中抛出的异常,并发送一个SubscirberExceptionEvent,不过不一定要处理。
EventBus eventBus = EventBus.builder().throwSubscriberException(true).build();
可以查看EventBusBuilder类和其文档获取可能的配置。
有些事件在提交之后携带着有益的信息。例如,可能是一个表明一些出初始化工作完成的事件信号。 或者,如果你有一些传感器和位置信息,并且你希望持有为最近的值。 这样,你可以使用粘性事件,而不是实现自己的缓存。事件总线在内存中保持着特定类型的最终粘性事件。这些粘性事件可以被传递给订阅者或者用于明确查询。所以,不需要任何的特殊逻辑来考虑已经可以获得的数据。
粘性事件在一个特定事件之前发布。
EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
此后,一个新的Act启动,使用registerSticky注册期间,就会立即获得之前发布的粘性事件。
@Override publicvoid onStart() { super.onStart(); EventBus.getDefault().registerSticky(this); } publicvoid onEventMainThread(MessageEvent event) { textField.setText(event.message); } @Override publicvoid onStop() { EventBus.getDefault().unregister(this); super.onStop(); }
-keepclassmembers class ** {
public void onEvent*(**);
}
# Only required if you use AsyncExecutor
-keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
申明:AsyncExecutor是一个非核心的实体类。这个类可以通过后台错误处理线程省下一些代码,但不是EventBus的核心。
AsyncExecutor就像线程池,只不过具有失败处理能力。如果失败会抛出异常,这个异常被包装在一个事件内部中,并自动被AsyncExecutor抛出。
通常情况下,可以使用AsyncExecutor.create()创建一个实例,并在Application作用域内持有。如果要执行一些事情,可以实现RunnableEx接口,并将其传递到AsyncExecutor的执行方法中。与Runnable不同,RunnableEx可能抛出异常。
如果RunnableEx的实现抛出异常,这个异常会被捕获到,并包装进一个ThrowableFailureEvent对象中,发布出来。
Code example for execution:
AsyncExecutor.create().execute( new RunnableEx { publicvoid run throws LoginException { remote.login(); EventBus.getDefault().postSticky(new LoggedInEvent()); // No need to catch Exception } } }
Code example for the receiving part:
publicvoid onEventMainThread(LoggedInEvent event) { // Change some UI } publicvoid onEventMainThread(ThrowableFailureEvent event) { // Show error in UI }
Check the COMPARISON.md