由于它们是两个活动,因此在尚未创建或处于停顿模式 ( )ActivitySubscriber
时发布事件。您需要使用粘性事件,即ActivityReceiver
onStop()
ActivitySubscriber.postSticky(...)
对于 ActivityReceiver,您有两个选择:
EventBus.getDefault().register(this)
在那之后的某个地方EventBus.getDefault().getStickyEvent()
EventBus.getDefault().registerSticky()
然后使用常规EventBus.getDefault().onEvent(...)
更新:
EventBus 3.0 改变了订阅方式。
不需要以特定后缀而是注释结尾的方法名称。
如何使用版本 3:
//// in your build.gradle
compile 'de.greenrobot:eventbus:3.0.0-beta1'
// alternatively you can target latest whatever currently
// compile 'de.greenrobot:eventbus:+'
//// from a class which needs to dispatch an event
// posting an event is as before, no changes
// here we dispatch a sticky event
EventBus.getDefault().postSticky(myStickyEvent);
//// from your class which needs to listen
// method name can be any name
// any of subscribe params is optional, i.e. can use just @Subscribe
@Subscribe(threadMode = ThreadMode.MainThread, sticky = true, priority = 1)
public void onEventBusEvent(@Nullable final StickyEvent stickyEvent) {
if (stickyEvent != null) {
...
// optionally you can clean your sticky event in different ways
EventBus.getDefault().removeAllStickyEvents();
// EventBus.getDefault().removeStickyEvent(stickyEvent);
// EventBus.getDefault().removeStickyEvent(StickyEvent.class);
}
}
有关版本 3 的更多详细信息和比较:
从来源中提取的一些细节:
ThreadMode.PostThread
订阅者将在发布事件的同一线程中被调用。这是默认设置。事件传递意味着最少的开销,因为它完全避免了线程切换。因此,对于已知可以在很短的时间内完成而不需要主线程的简单任务,这是推荐的模式。使用此模式的事件处理程序必须快速返回以避免阻塞可能是主线程的发布线程。
ThreadMode.MainThread
订阅者将在 Android 的主线程(有时称为 UI 线程)中调用。如果发布线程是主线程,将直接调用事件处理方法。使用此模式的事件处理程序必须快速返回以避免阻塞主线程。
ThreadMode.BackgroundThread
订阅者将在后台线程中调用。如果发布线程不是主线程,则事件处理方法将直接在发布线程中调用。如果发布线程是主线程,EventBus 使用单个后台线程,它将按顺序传递其所有事件。使用此模式的事件处理程序应尽量快速返回以避免阻塞后台线程。
ThreadMode.Async
事件处理程序方法在单独的线程中调用。这始终独立于发布线程和主线程。发布事件从不等待使用此模式的事件处理程序方法。如果它们的执行可能需要一些时间,例如网络访问,事件处理程序方法应该使用这种模式。避免同时触发大量长时间运行的异步处理程序方法,以限制并发线程数。EventBus 使用线程池从已完成的异步事件处理程序通知中有效地重用线程。
- 默认值
@Subscribe
threadMode = ThreadMode.PostThread
sticky = false
- 如果为真,则提供最近的粘性事件(与de.greenrobot.event.EventBus.postSticky(Object)
此订阅者一起发布(如果事件可用)
priority = 0
- 订阅者优先级影响事件传递的顺序。在同一交付线程中,优先级较高的订阅者将在其他优先级较低的订阅者之前收到事件。默认优先级为0。注意:优先级不影响不同线程模式的订阅者之间的传递顺序。
编辑 2
现在有一个专门的站点可以解决来自 lib 创建者的任何 Greenrobot EventBus 问题:
http://greenrobot.org/eventbus/