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. 的命名規則是不能立即直觀的新用戶。

兩個缺點已經被淘汰與更新,所以現在你可以命名你的方法不管你喜歡,並指出在哪個線程你想的事件註釋參數內運行。