奥托事件总线运行时订阅事件

时间:2016-06-15 15:01:09

标签: android observer-pattern otto

Otto是否可以在不使用@Subscribe注释的情况下订阅活动?

在我的用例中,我不知道我的对象应该在编译时订阅哪个事件。我希望在运行时根据某些规则来做。

2 个答案:

答案 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