Otto
是否可以在不使用@Subscribe
注释的情况下订阅活动?
在我的用例中,我不知道我的对象应该在编译时订阅哪个事件。我希望在运行时根据某些规则来做。
答案 0 :(得分:2)
我想你可以使用这样的解决方法,
public class MainClass {
private EventObserver eventObserver;
public MainClass() {
if(...someCondition...) {
eventObserver = new FirstEventObserver();
} else {
eventObserver = new SecondEventObserver();
}
}
public onEvent(Event event) {
if (event instanceOf FirstEvent) {
... handle event ...
} else if (event instanceOf SecondEvent) {
... handle event ...
}
}
}
public abstract class EventObserver {
protected MainClass mainClass;
public void setMainClass(MainClass mainClass) {
this.mainClass = mainClass;
}
protected void notifyMainClass(Event event) {
if (mainClass != null) {
mainClass.onEvent(event);
}
}
}
public class FirstEventObserver extends EventObserver {
public FirstEventObserver() {
bus.subscribe(this);
}
@Subscribe
public void onEvent(FirstEvent event) {
notifyMainClass();
}
}
public class SecondEventObserver extends EventObserver {
public SecondEventObserver() {
bus.subscribe(this);
}
@Subscribe
public void onEvent(SecondEvent event) {
notifyMainClass();
}
}
public abstract class Event {
}
public abstract class FirstEvent extends Event {
}
public abstract class SecondEvent extends Event {
}
另一种解决方法,这是一个更清洁的解决方案。您可以使用所需的类型在运行时生成事件。
public class MainClass {
@Subscribe
public void onEvent(Event event) {
if (event.getType() == EventType.FIRST_EVENT) {
... handle event ...
} else if (event.getType() == EventType.SECOND_EVENT) {
... handle event ...
}
}
}
public class Event {
public enum EventType {
FIRST_EVENT,
SECOND_EVENT
}
private EventType eventType;
public Event(EventType eventType) {
this.eventType = eventType;
}
public EventType getType() {
return eventType;
}
}
答案 1 :(得分:0)
我创建了一个框架,用于在运行时使用Otto订阅事件。不同于不同事件类型的不同Model类,不同的事件可以有不同的EventDelegate
。这些事件委托将只接收和事件并将它们传递给订阅者类。
典型的EventDelegate
将如下所示
public abstract class OttoEventDelegate {
private OttoEventListener ottoEventListener;
public OttoEventDelegate(OttoEventListener ottoEventListener) {
this.ottoEventListener = ottoEventListener;
}
public void register() {
BaseApplication.getInstance().getBus().register(this);
}
public void unregister() {
BaseApplication.getInstance().getBus().unregister(this);
}
public OttoEventListener getOttoEventListener() {
return ottoEventListener;
}
public void setOttoEventListener(OttoEventListener ottoEventListener) {
this.ottoEventListener = ottoEventListener;
}
}
解释了这种方法in this article。另外,如果你想看看实现。它在github上here。