如何从库Otto正确扩展类?

时间:2015-03-12 15:42:28

标签: android observers otto

我在我的项目中使用Otto库。我需要这个库中的任何功能,其中没有。我想这样做:

Bus.post(MessageType.USER_SIGN_UP_SUCCESS, user);

并且在我的方法中意识到这样做:

@Subscribe({MessageType.USER_LOGGED_IN_SUCCESS, MessageType.USER_SIGN_UP_SUCCESS})
        public void getUserFromServer(User user) {
,,,,,,,,,,,,,,
}

为此我必须从githab复制所有Otto类,并更改它们。我无法从Otto实现,因为一些变量是私有的。

并更改了Bus类中的访问修饰符并从中扩展。

public class SkipBus extends Bus {

    public void post(MessageType messageType, Object event) {
        if (event == null) {
            throw new NullPointerException("Event to post must not be null.");
        }
        enforcer.enforce(this);

        Set<Class<?>> dispatchTypes = flattenHierarchy(event.getClass());

        boolean dispatched = false;
        for (Class<?> eventType : dispatchTypes) {
            Set<EventHandler> wrappers = getHandlersForEventType(eventType);

            if (null == wrappers || wrappers.isEmpty()) {
                continue;
            }

            dispatched = true;
            for (EventHandler wrapper : wrappers) {
                Subscribe annotation = wrapper.method.getAnnotation(Subscribe.class);

                boolean isFounded = false;
                MessageType messageTypes[] = annotation.value();
                for (MessageType type : messageTypes) {
                    if (type == messageType) {
                        isFounded = true;
                        break;
                    }
                }

                if (isFounded) {
                    enqueueEvent(event, wrapper);
                }
            }
        }

        if (!dispatched && !(event instanceof DeadEvent)) {
            post(new DeadEvent(this, event));
        }

        dispatchQueuedEvents();
    }
}

但为此我必须复制项目中的所有类。 告诉我怎样才能让它变得更容易?或告诉我另一个可以做我想做的图书馆

2 个答案:

答案 0 :(得分:1)

实际上,Otto旨在使用Object的类型来分隔消息类型。

@Subscribe
public void eventReceived(UserSignUpEvent user) {
}

@Subscribe
public void eventReceived(UserLoginEvent user) {
}

<强> MainActivity.java

@Subscribe
public void eventReceived(User user) {
    if (user.getMessageType() == MessageType.USER_SIGN_UP_SUCCESS) {
    }
}

<强> SecondActivity.java

@Subscribe
public void eventReceived(User user) {
    if (user.getMessageType() == MessageType.USER_LOGIN_SUCCESS) {
    }
}

您无需像这样分离MessageType(您不应该)。我建议你将代码设计模式改为Otto的设计模式。否则,您必须复制整个Otto源代码并进行编辑,就像您当前所做的那样。

答案 1 :(得分:0)

Otto本身很简单,所以不需要扩展它。您只需为它创建事件和事件处理程序。事件可以是任何对象,因此您可以执行以下操作:

public enum LoginType {
    SUCCESS,
    FAILED
}

在您的登录处理器中:

private void login(...) {
    // process login
    // if everything is ok
    if(...) {
        bus.post(LoginType.SUCCESS);
    } else {
        bus.post(LoginType.FAILED);
    }
}

在任何需要的地方处理此事件:

@Subscribe
public void onLogin(LoginType loginType) {
    switch(loginType) {
        case SUCCESS:
            // do what you need
        break;

        case FAILED:
            // show an error or something
        break;
    }
}

因此无需扩展库,您只需以适当的方式设计事件。