通过使用EventBus,我需要在Activity中发布一个事件(MyEvent)并在Android中的另一个Activity中接收该事件.我尝试了greenrobot EventBus性能测试项目,但无法做到这一点.
我在ActivitySubscriber中尝试过
MyEvent event = new MyEvent();
EventBus.getDefault().post(event);
Run Code Online (Sandbox Code Playgroud)
并试图在接收事件ActivityReceiver为
EventBus.getDefault().register(this);
public void onEvent(MyEvent event){
....
}
Run Code Online (Sandbox Code Playgroud)
但是我无法收到这个活动.任何人都可以让我知道我在哪里做错了吗?
Dim*_*nov 23
由于它们是两个活动,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);
}
}
Run Code Online (Sandbox Code Playgroud)
有关版本3的更多详细信息和比较:
从消息来源中提取的一些细节:
ThreadMode.PostThread
订阅者将在同一个帖子中调用,该帖子将发布该事件.这是默认值.事件传递意味着开销最小,因为它完全避免了线程切换.因此,对于已知完成的简单任务,这是一种推荐的模式,非常短的时间而不需要主线程.使用此模式的事件处理程序必须快速返回以避免阻止发布线程,这可能是主线程.
ThreadMode.MainThread
订阅者将在Android的主线程(有时称为UI线程)中调用.如果发布线程是主线程,则将直接调用事件处理程序方法.使用此模式的事件处理程序必须快速返回以避免阻塞主线程.
ThreadMode.BackgroundThread
订阅者将在后台线程中调用.如果发布线程不是主线程,则将在发布线程中直接调用事件处理程序方法.如果发布线程是主线程,则EventBus使用单个后台线程,该线程将按顺序传递其所有事件.使用此模式的事件处理程序应尝试快速返回以避免阻止后台线程.
ThreadMode.Async
事件处理程序方法在单独的线程中调用.这始终独立于发布线程和主线程.发布事件永远不会等待使用此模式的事件处理程序方法.如果事件处理程序的执行可能需要一些时间,例如用于网络访问,则应使用此模式.避免同时触发大量长时间运行的异步处理程序方法来限制并发线程数.EventBus使用线程池从已完成的异步事件处理程序通知中有效地重用线程.
@Subscribe
threadMode = ThreadMode.PostThreadsticky = false- 如果为true,则发送最近的粘性事件(与de.greenrobot.event.EventBus.postSticky(Object)此订阅者一起发布(如果事件可用)priority = 0 - 订户优先级以影响事件传递的顺序.在同一个传递线程中,较高优先级的订户将在优先级较低的其他订户之前接收事件.默认优先级为0.注:优先级不不影响使用不同的线程模式,用户之间传递的顺序.现在有一个专门的网站可以为lib的创建者提供任何Greenrobot EventBus问题:
http://greenrobot.org/eventbus/
| 归档时间: |
|
| 查看次数: |
16186 次 |
| 最近记录: |