EventBus:所有子类都接收事件

时间:2018-01-12 18:57:25

标签: android event-bus greenrobot-eventbus

我有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为每个子类调用2次。

1 个答案:

答案 0 :(得分:3)

如果您需要针对不同对象的不同消息,则需要创建不同的结构。在您的情况下,您希望基于某些逻辑(我不知道)向对象A发送消息并向对象B发送另一条消息。

我的解决方案是在A类中创建一个MyEvent,在B类中创建一个MyEvent(我知道,可能不像父类不应该知道孩子那样好)。那么你的逻辑将是这样的:

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

另一种选择是创建不同的类MyEventA和MyEventB,来自不同类的每个对象可以分别注册到MyEventA和MyEventB。通过这种方式,您的父类不需要了解有关子项的任何信息。

无论您选择哪种解决方案,解决方案都是您需要发送不同的对象类型才能使其正常工作

EDIT 根据您从BaseActivity

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

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

MyEventA:MyEvent

MyEventB:MyEvent

然后在A班你将有

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

和B组

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

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

希望它有所帮助。