Greenbot Eventbus 3.0:onEvent,onEventMainThread,onEventBackgroundThread和onEventAsync有什么区别?

时间:2016-02-14 03:09:07

标签: java android event-bus greenrobot-eventbus greenrobot-eventbus-3.0

我对Greenrobot's EventBus 3.0

onEventonEventMainThreadonEventBackgroundThreadonEventAsync的使用感到有点困惑

从我在documentation中看到的内容:

  • onEventThreadMode.POSTING(默认)
  • 一起使用
  • onEventMainThreadThreadMode.MAIN
  • 一起使用
  • onEventBackgroundThreadThreadMode.BackgroundThread
  • 一起使用
  • onEventAsyncThreadMode.ASYNC
  • 一起使用

但是在从后台线程发布事件的情况下:

@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(MyEvent event) {
    // some UI manipulation
}

具有与以下完全相同的行为:

@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(MyEvent event) {
    // some UI manipulation
}

@Subscribe
public void onEventMainThread(MyEvent event) {
    // some UI manipulation
}

抛出CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.,因为该帖子与发布帖子(我的测试中的后台线程)相同。

从版本3.0开始,@Subscribe注释是必需的,所以我不明白在哪种情况下我应该使用onEvent以外的方法。他们是否继续促进从EventBus 2升级到3?

2 个答案:

答案 0 :(得分:17)

我找到了答案,而不是EventBus 2,方法名称并不重要,因为在EventBus 3上使用注释来支持Reflection,所以以下内容将起作用:

@Subscribe(threadMode = ThreadMode.MAIN)
public void someMethodName(MyEvent event) {
    // some UI manipulation
}

我在这里保留这个问题,以便为可能有同样问题的人节省时间。

答案 1 :(得分:6)

Username (12) 是使用 EventBus 注册方法的注释,过去这是使用反射完成的,这就是为什么你必须在特定方法中命名方法的原因方式(@SubscribeonEvent等)。这有两个缺点:

  1. Java中的反射很慢,
  2. 新用户的命名约定并不是直观的。
  3. 这些缺点已经通过更新消除了,所以现在您可以随意命名您的方法,并指出您希望事件在注释参数中运行的线程。