Greenbot事件总线3.0:onEvent,onEventMainThread,onEventBackgroundThread和onEventAsync有什么区别?

我有点困惑onEventonEventMainThreadonEventBackgroundThreadonEventAsync在Greenrobot的EventBus 3.0中的用法

从我在文档中看到的内容 :

  • onEvent使用ThreadMode.POSTING (默认)
  • onEventMainThreadonEventMainThread使用
  • onEventBackgroundThreadonEventBackgroundThread使用
  • onEventAsynconEventAsync使用

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

 @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. 因为线程和发布线程(在我的testing中的后台线程)是一样的。

自3.0版以来, @Subscribe注解是必需的,所以我不明白在哪种情况下,我应该使用除了onEvent之外的方法。 他们是否保持从EventBus 2升级到3?

Solutions Collecting From Web of "Greenbot事件总线3.0:onEvent,onEventMainThread,onEventBackgroundThread和onEventAsync有什么区别?"

我find了答案,与EventBus 2相反,方法名称并不重要,因为在EventBus 3上注解被用于reflection,因此以下内容将起作用:

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

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

@Subscribe是用EventBus注册方法的注释,过去是用reflection来完成的,所以你必须以特定的方式( onEventonEventMainThread等)来命名这些方法。 这有两个缺点:

  1. Java中的reflection很慢,而且
  2. 命名约定对于新用户来说并不直观。

这两个缺点已经消除了更新,所以现在你可以给你的方法命名,无论你喜欢什么,并指出你想在哪个线程中运行事件在注释参数中运行。