2017-09-08 50 views
1

由於番石榴的EventBus文檔很短我問在這裏:番石榴EventBus:調度事件給多個用戶

有沒有一種方法來分發事件到多個訂戶或事件總是由第一個合適的用戶消耗?

如果後者是這種情況,最好是擴展EventBus類以添加這樣的功能或在自己的應用程序中實現整個事件總線邏輯?

回答

1

只要符合事件類型,事件就會路由到所有註冊的訂戶。

它在EventBusJavadoc

發佈活動

要發佈的事件時,只需提供事件對象的職位(Object)方法。 EventBus實例將確定事件的類型並將其路由到所有註冊的偵聽器。

事件根據它們的類型進行路由 - 事件將被傳遞給任何訂閱者,以便將事件分配給任何類型。這包括已實現的接口,所有超類以及由超類實現的所有接口。

+0

非常感謝 - 我閱讀並測試過,但我的測試無效:我沒有註冊第二個監聽者;-) – Hannes

0

如果是後者的話,將能夠更好地延長EventBus類,以增加這樣的功能或實現在自己的應用程序的整個事件總線邏輯是什麼?

我猜,你需要的是一個handled屬性添加到事件並添加testAndSet所有的處理程序。如果你有很多這樣做,手動做它肯定是容易出錯的。

你可以爲你的事件創建一個包裝,它不會讓你訪問它,而不會調用它。喜歡的東西

@RequiredArgsConstructor 
class WrappedEvent<E extends MyEvent> { 
    private final E event; 
    private boolean handled; 

    Optional<E> getAndMarkHandledUnlessHandled() { 
     if (handled) { 
      return Optional.empty(); 
     } else { 
      handled = true; 
      return Optional.of(event); 
     } 
    } 
} 

或做它喜歡callAndMarkHandledUnlessHandled(Consumer<E> consumer)更多功能性的方式。對於異步調度,您可以使用AtomicBoolean

但是,由於刪除,這將不會與WrappedEvent<A>WrappedEvent<B>一起使用,因爲EventBus沒有可用的通用信息。您可以像WrappedA extends WrappedEvent<A> {}那樣繼承包裝並使用它。這該死的醜陋。

如果你不想偷偷進入它的包裝,那麼有意義地擴展EventBus幾乎是不可能的。最簡單的方法可能是分解整個包並在this line之後添加一箇中斷。