【问题标题】:Otto Event Bus: different Event ClassesOtto Event Bus:不同的事件类
【发布时间】:2015-09-21 12:30:19
【问题描述】:

Otto 如何处理不同的事件类?是否可以有不同的事件类别?

是否只有侦听特定事件类的侦听器会收到通知?例如。下面的示例是否可以工作,只通知 A 类中的侦听器?假设EventClassAEventClassB 没有扩展同一个超类。

class A {
    @Subscribe
    public void handleEvent(EventClassA event)
    {
            //
    }
}

class B {
    @Subscribe
    public void handleEvent(EventClassB event)
    {
            //
    }
}

class C {
    public void postEvent() {
        bus.post(new EventClassA());
    }
}

【问题讨论】:

    标签: android events event-bus otto


    【解决方案1】:

    是否可以有不同的事件类别?

    是的。

    是否只有侦听特定事件类的侦听器会收到通知?

    是的。在您的示例中,订阅总线的A 实例将使用handleEvent() 调用,而不会调用订阅总线的B 实例。

    【讨论】:

    • 正是我需要知道的,谢谢。通过instanceOf 等为我省去了很多麻烦。在主类中有static Bus bus = new Bus();Bus getBus() 方法,并在其他地方使用这个总线可以吗?
    • 我实际上并不了解静态总线,但我宁愿为每个事件创建单独的总线。原因是静态总线意味着该类必须存在才能调用静态总线,而且我认为如果每次要发送事件时创建一个新总线,GC 目的会更容易。
    • 是的,当使用静态总线时,我得到Event bus [Bus "default"] accessed from non-main thread null。所以如果我每次想发东西时都创建一个新的总线,它仍然会被其他线程上的其他总线接收吗?
    • @tsorn:“在主类中使用静态 Bus bus = new Bus(); 和 Bus getBus() 方法,并在其他任何地方使用此总线是否可以?” -- AFAIK,这是推荐的模式。 “当使用静态总线时,我会从非主线程 null 访问事件总线 [Bus “default”]”——这与它是静态的无关,而与 Otto 线程强制执行有关,AFAIK。就个人而言,我使用 greenrobot 的 EventBus,因为它具有更灵活的线程模型。 “所以如果我每次要发东西时都创建一个新的总线,它仍然会被其他线程上的其他总线接收吗?” -- 没有。
    • @tsorn:Otto 的一个关键限制是交付线程始终是主应用程序线程。这就是我使用greenrobot 的EventBus 的原因。感觉 Otto-ish(因为它们都是从 Guava 的 EventBus 派生的),但是您可以根据每个事件处理方法指定使用哪个线程来接收事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多