7

我有点困惑与onEventonEventMainThreadonEventBackgroundThreadonEventAsyncGreenrobot's EventBus 3.0Greenbot Eventbus 3.0:onEvent,onEventMainThread,onEventBackgroundThread和onEventAsync有什么区别?

使用从我在documentation看到:

  • onEvent用于与ThreadMode.POSTING(默认)
  • onEventMainThreadThreadMode.MAIN
  • onEventBackgroundThread配合使用ThreadMode.BackgroundThread
  • onEventAsync用于与ThreadMode.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?

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

我:

回答

15

我已经找到了答案,而不是EventBus 2,由于EventBus 3个注解有利于思考的使用,所以下面的工作方法名称并不重要在这里留下这个问题,以便为可能有相同问题的人节省时间。

+2

是的。已完全移动到注释和方法名称已无关紧要。很高兴你找到答案。 – iZBasit

6

@Subscribe是注册与EventBus的方法,在过去这是与反射做了注解,这就是为什么要你说出一个特定的方式(onEventonEventMainThread等)的方法。这有两个缺点:

  1. 反思是在Java中相当缓慢,并
  2. 的命名规则是不能立即直观的新用户。

两个缺点已经被淘汰与更新,所以现在你可以命名你的方法不管你喜欢,并指出在哪个线程你想的事件注释参数内运行。