EventBus:所有子 类 接收事件

EventBus: all child classes receive event

我有带 fun onEvent(event: MyEvent) 的 BaseActivity 和 4 个扩展 BaseActivity 的活动。我的问题是 BaseActivity 处理所有事件。这意味着当发送一个事件时,它会被此时实例化的 BaseActivity 的所有子类接收,这导致 onEvent() 多次 运行

class BaseActivity {
    ...
    fun onEvent(event: MyEvent) {
        //do some cool stuff
    }
}

class A: BaseActivity {

}

class B: BaseActivity {

}


class SomeClass {

    fun somefun() {
        EventBus.getDefault().post(MyEvent("woadude"));
    }
}

所以在这种情况下,每个子类都会调用 BaseActivity 中的 onEvent 两次。

如果您想要针对不同的 object 发送不同的消息,那么您需要创建不同的结构。在您的情况下,您想根据某种逻辑(我不知道)向 object A 发送一条消息,向 object B 发送另一条消息。

我的解决方案是在class A 中创建一个MyEvent,在class B 中创建一个MyEvent(我知道,可能不如parent classes不应该知道 children)。那么你的逻辑将是这样的:

fun somefun() {
  if("some condition"){
    EventBus.getDefault().post(A.MyEvent("woadude"));
  }if("another condition") {
    EventBus.getDefault().post(B.MyEvent("woadude"));
  }      
 }

另一种选择就是创建不同的classes MyEventA和MyEventB,并且来自不同classes的每个object可以分别注册到MyEventA和MyEventB。通过这种方式,您 parent class 不需要了解任何有关 children 的信息。

无论您选择什么解决方案,解决方案是您需要发送不同的 object 类型才能使其工作

编辑 根据您需要从 BaseActivity

中删除此功能的新信息
   fun onEvent(event: MyEvent) {
        //do some cool stuff
    }

并使其抽象化。使用 MyEvent 作为您要创建的每个 MyEvent class 的 parent class。所以你将拥有:

我的事件A:我的事件

我的事件B:我的事件

那么在classA中你会得到

fun onEvent(event: MyEventA) {
        //do some cool stuff
    }

并在 class B

fun onEvent(event: MyEventB) {
        //do some cool stuff
    }

当然,如果您提供有关该问题的更多信息,我的回答可能会更好。

希望对您有所帮助。