7

我对Greenrobot的 EventBus 3.0中的 、 和onEventonEventMainThread用法有点困惑onEventBackgroundThreadonEventAsync

从我在文档中看到的:

  • 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?

4

2 回答 2

18

我找到了答案,与 EventBus 2 不同,方法名称并不重要,因为在 EventBus 3 上使用了有利于反射的注释,因此以下方法将起作用:

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

我把这个问题留在这里是为了给可能有同样问题的人腾出时间。

于 2016-02-14T03:33:12.247 回答
6

@Subscribe是向EventBus注册方法的注释,过去这是通过反射完成的,这就是为什么您必须以特定方式(等)命名方法的onEvent原因onEventMainThread。这有两个缺点:

  1. Java 中的反射非常慢,并且
  2. 命名约定对新用户来说并不是很直观。

更新消除了这两个缺点,因此现在您可以随意命名您的方法,并在注释参数中指明您希望事件在哪个线程中运行。

于 2016-02-26T12:56:26.747 回答